我有一个类似
的查询SELECT fld from table
WHERE id > 50000
AND fld_1 = 0
LIMIT 1000
id和fld_1都被编入索引。但它总是使用其中任何一个以获得更好的结果?强制索引仅使用其中一个。
我指的是 - http://dev.mysql.com/doc/refman/5.1/en/index-merge-optimization.html#index-merge-intersection
答案 0 :(得分:3)
我不知道有什么方法可以强制进行索引合并。该手册页上的条件描述了可以完成索引合并的条件,并且优化器应该自动执行(如果可以的话(如果基于成本的优化器决定它值得这样做)。如果不可能,则无法强制进行索引合并。
但是复合索引通常比索引合并更好,所以这将是一个更好的策略。
列的顺序很重要。将相等比较的列放在索引中,然后列不等式比较。
CREATE INDEX idxFld1Id ON `table` (fld_1, id);
另见我的演讲How to Design Indexes, Really。
您可以使用http://www.percona.com/doc/percona-toolkit/pt-online-schema-change.html
进行架构更改,例如创建索引 - 无需停机当然,首先在数据库的测试副本上进行尝试,以了解如何使用该工具。
答案 1 :(得分:0)
通过替换您的索引名称来尝试以下操作
从表使用索引(xxx
)中选择fld
WHERE id> 50000
AND fld_1 = 0
限制1000