3

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

1)在创建索引时,我是否应该首先将其设为一个带有tenant_id 的复合索引?(所有查询都有tenant_id = ?在WHERE 子句中)

2) 由于所有列都可以在 WHERE 子句和 order by 子句中使用,我应该对它们都创建索引吗?(知道当我按没有索引的列排序时,与拥有约 1,500,000 行的租户一起执行需要 6 秒)

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)
4

1 回答 1

5

对问题的一些简短回答。据我所知,您对使用感到困惑indexes

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

Consideration 1-

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

也就是说,特定列中的 DISTINCT 行数很高。

创建额外的 index总是会为 MySQL 服务器创建开销,所以你不能创建每一列一个index. 您的单个表可以拥有的索引数量也有限制 = 每个表 64


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

前提是——

Consideration 2- 数量UPDATEs小于上SELECTs的数量tenant_id


Consideration 3-indexe就 而言,s 应该尽可能小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

于 2012-12-30T04:56:48.800 回答