我需要索引我分区的键吗?

tir*_*ing 6 mysql innodb index partitioning mysql-5.5

我有一个 InnoDB 客户表,按 KEY 分区,每个分区是一个美国州。我有电话号码索引,性能很棒。我们还需要在给定的美国州中按姓氏进行 SELECT。我应该在姓氏 AND 状态上创建索引,还是没有意义,因为表已经按状态分区了?

这是否会占用不必要的空间,因为 InnoDB 应该已经知道哪个分区是哪个状态,并且它只需要在该分区中找到与姓氏匹配的所有行?

我们没有做任何连接......这只是一个简单的查询,如下所示:

SELECT * FROM table WHERE lastname = "Smith" AND state="NY"
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 2

您应该创建一个包含lastname和 的索引state,lastname

想一想吧。什么会迫使查询优化器计划查询以在分区内按姓氏进行搜索?唯一的做法是在正确的分区内进行全表扫描。

假设美国有 50 个州(不包括波多黎各、关岛、美国联邦或保护国)

如果您有 100 万行,则每个州平均有 20,000 行。对姓氏进行 20,000 次表扫描可能还不错。然而,我们谈论的是美国。大量人口可能居住在纽约、加利福尼亚、德克萨斯和佛罗里达。少数人将居住在罗德岛州、爱达荷州、怀俄明州和蒙大拿州。通过全表扫描的搜索时间会有很大差异。有鉴于此,对每个州内的名称进行索引将是有益的。

我建议两个索引

  • LastName :第二个索引将使查询优化器在每个分区中搜索 LastName。任何一天进行 50 次索引查找肯定会击败 50 次全表扫描。您提到您仅对电话号码有索引,并且性能非常好。这同样适用于仅姓氏索引。
  • State,LastName :第一个索引将使查询优化器仅在一个分区(您选择的状态)下搜索 LastName(如果查询优化器足够智能来检查查询并选择正确的分区,则可能没有必要)。

更新 2012-10-09 16:21 美国东部时间

平心而论,如果查询优化器足够智能,可以根据 WHERE 子句从一个分区中检索数据,那么索引(state,lastname)可能就没有必要了。尽管如此,您仍然必须对 建立索引lastname。这样,每个分区都根据姓氏建立索引。

我最初的索引建议(state,lastname)实际上是基于我过去如何索引在 MERGE 存储引擎下组合的 MyISAM 表

以下是我过去关于 MERGE 表的示例:

由于实现了表分区,因此对姓氏进行索引应该足以满足您的需求。事实上,回想一下您说过电话号码已被索引并且性能非常好,所以,我第二次说,索引姓氏也应该对您有好处。