数据库
首页 > 数据库> > 使用tenant_id进行Mysql复合索引

使用tenant_id进行Mysql复合索引

作者:互联网

我们有一个多租户应用程序,它有一个包含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)

解决方法:

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

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

考虑1 –

(Number of UNIQUE Entries of the Columns)/(Number of Total Entries in the Column) ~= 1

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

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

现在,如果所有搜索查询中都存在tenant_id,则应将其视为索引或复合键,

提供 –

考虑2 – UPDATE的数量少于tenant_id上的SELECT数量

考虑3 – 在数据类型方面,索引应尽可能小.你不能创建一个varchar 64索引
http://www.mysqlperformanceblog.com/2012/08/16/mysql-indexing-best-practices-webinar-questions-followup/

注意事项1 – 即使您确实将任何列声明为索引,MySQL优化器仍可能不会将其视为查询执行的最佳计划.因此,请始终使用EXPLAIN来了解最新情况. http://www.mysqlperformanceblog.com/2009/09/12/3-ways-mysql-uses-indexes/

注意事项2 –
您可能希望缓存搜索查询,因此请记住不要在SELECT查询中使用不可预测的语句,例如NOW()

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

标签:mysql,indexing,multi-tenant
来源: https://codeday.me/bug/20190901/1783053.html