【发布时间】:2019-05-24 18:54:06
【问题描述】:
我正在努力找出最适合放置我的索引的列,而添加额外的索引似乎会对查询性能产生不利影响。
例如,我对大约 5m 行的表进行以下查询;
SELECT col1, col2 FROM table WHERE col1 = 'a' AND col2 = 'b' AND col3 = 'c';
在没有索引的情况下运行这个需要 12 秒!
我在所有 3 列上添加了一个复合索引 - table_col1_col2_col3_index;
我的查询现在下降到 2 秒 - 太棒了!
我现在在同一张表上有另一个查询(任何列上都没有索引):
SELECT col1, col2 FROM table WHERE col1 = 'a';
自行运行,查询需要 4 秒 - 仍然很慢!
所以现在我将单列索引添加到 col1 table_col1_index
我的查询减少到 0.2 秒。这很好,但是我现在再次运行原始查询,并注意到它使用的索引与我之前指定的索引相反。原来的查询现在在 6 秒后备份。
我不确定如何确保可以同时优化两个查询。
【问题讨论】:
-
如果你只有那个原始的多列索引怎么办?只要您按顺序搜索列,MySQL 仍应使用该索引。因此,如果您有一个包含
col1、col2和col3的多列索引集,并且仅对col1进行查询,它仍将使用该索引。或者,如果您搜索col1和col2- 但如果您单独搜索col2,则不会。 -
您暗示在某些时候删除第一个复合索引;只是为了确定,你把它加回来了,对吧? MySQL 通常非常擅长选择最佳索引,但如果没有,则可以提示或强制使用特定索引。 official ref
-
您的第二个查询应该使用第一个索引,性能相当。