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)
您应该创建一个包含lastname和 的索引state,lastname。
想一想吧。什么会迫使查询优化器计划查询以在分区内按姓氏进行搜索?唯一的做法是在正确的分区内进行全表扫描。
假设美国有 50 个州(不包括波多黎各、关岛、美国联邦或保护国)
如果您有 100 万行,则每个州平均有 20,000 行。对姓氏进行 20,000 次表扫描可能还不错。然而,我们谈论的是美国。大量人口可能居住在纽约、加利福尼亚、德克萨斯和佛罗里达。少数人将居住在罗德岛州、爱达荷州、怀俄明州和蒙大拿州。通过全表扫描的搜索时间会有很大差异。有鉴于此,对每个州内的名称进行索引将是有益的。
我建议两个索引
平心而论,如果查询优化器足够智能,可以根据 WHERE 子句从一个分区中检索数据,那么索引(state,lastname)可能就没有必要了。尽管如此,您仍然必须对 建立索引lastname。这样,每个分区都根据姓氏建立索引。
我最初的索引建议(state,lastname)实际上是基于我过去如何索引在 MERGE 存储引擎下组合的 MyISAM 表。
以下是我过去关于 MERGE 表的示例:
Jan 04, 2012:从mysql中太多表中获取列Jan 15, 2012:单独的表还是分区一张大表?由于实现了表分区,因此对姓氏进行索引应该足以满足您的需求。事实上,回想一下您说过电话号码已被索引并且性能非常好,所以,我第二次说,索引姓氏也应该对您有好处。
| 归档时间: |
|
| 查看次数: |
3271 次 |
| 最近记录: |