【发布时间】:2012-12-28 04:15:59
【问题描述】:
我们有一个多租户应用程序,它有一个包含 129 个字段的表,这些字段都可以在 WHERE 和 ORDER BY 子句中使用。我现在花了 5 天的时间试图找出最适合我们的索引策略,我获得了很多知识,但我仍然有一些问题。
1) 在创建索引时,我是否应该始终将其作为一个复合索引,其中包含tenant_id ?(所有查询在 WHERE 子句中都有 tenant_id = ?)
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)
【问题讨论】:
-
在不知道表结构的情况下,很难在这个问题上给出建议。
-
好的,我会发布结构
-
什么是表引擎?如果这是 InnoDB,请确保您的 innodb_buffer_pool_size 尽可能大。如果您制作 PK tenant_id + 一些唯一 ID(除了 ID 之外,您是否有另一个唯一约束),那么它将成为任何索引的一部分,您也不需要在其他索引中拥有它,因为数据将是按tenant_id 聚集的范围查询会更快。此外,您可以按tenant_id 对表进行分区
-
是的,它是 InnoDB,如果我让 PK tenant_id + 一些唯一的 id 不会影响使用 ID 列的连接吗?
标签: mysql indexing multi-tenant