使用tenant_id进行Mysql复合索引

red*_*777 3 mysql indexing multi-tenant

我们有一个多租户应用程序,它有一个包含129个字段的表,可以在WHERE和ORDER BY子句中使用.我花了5天时间试图为我们找到最好的索引策略,我获得了很多知识,但我仍然有一些问题.

1)创建索引时,我应该总是首先使用tenant_id作为复合索引吗?(所有查询在WHERE子句中都有tenant_id =?)

2)由于所有列都可以在WHERE子句和order by子句中使用,我应该为它们创建一个索引吗?(正确的是,当我通过没有索引的列进行排序时,需要6s来执行具有大约1,500,000行的租户)

3)制作PK(tenant_id,ID),但这不会影响该表的连接吗?

任何关于如何处理这个的建议将非常感激.

======数据库引擎是InnoDB

=======

结构体 :

ID bigint(20) auto_increment primary
tenant_id int(11)
created_by int(11)
created_on Timestamp
updated_by int(11)
updated_on Timestamp
owner_id int(11)
first_name VARCHAR(60)
last_name VARCHAR(60)
.
.
.
(some 120 other columns that are all searchable)
Run Code Online (Sandbox Code Playgroud)

Jod*_*ddy 5

几个问题的简要回答.据我所知,你对使用感到困惑indexes

如果比率,请考虑在列上创建索引 -

Consideration 1 -

(列的唯一条目数)/(列中的总条目数)〜= 1

那是特定列中DISTINCT行的数量很高.

创建额外的 index将永远为MySQL服务器创建开销,因此您不能创建每个列index.单个表可以拥有的索引数量也有限制=每个表64个


现在,如果您tenant_id出现在所有搜索查询中,则应将其视为一个index或一个composite key,

提供 -

Consideration 2-数UPDATEs是小于的数量SELECTstenant_id


Consideration 3- indexes应该尽可能小data types.你不能创建一个varchar 64索引
http://www.mysqlperformanceblog.com/2012/08/16/mysql-indexing-best-practices-webinar-questions-followup/


Point to Note 1 - 即使您确实将任何列声明为索引,MySQL优化器仍可能不会将其视为查询执行的最佳计划.所以总是EXPLAIN用来了解最新情况.http://www.mysqlperformanceblog.com/2009/09/12/3-ways-mysql-uses-indexes/


Point to Note 2- 您可能想要cache搜索查询,因此请记住不要在SELECT查询中使用不可预测的语句,例如NOW()

最后 - 制作PK(tenant_id,ID)不应该影响桌面上的连接.
一个很棒的链接来回答你所有的问题 - http://www.percona.com/files/presentations/WEBINAR-MySQL-Indexing-Best-Practices.pdf