我有一个看起来像的查询
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
我有一个看起来像的查询
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
我不知道有什么方法可以强制索引合并。该手册页上的条件描述了可以完成索引合并的条件,如果可以的话,优化器应该自动完成(并且如果基于成本的优化器认为这样做是值得的)。如果不可能,您不能强制索引合并。
但无论如何,复合索引通常比索引合并执行得更好,所以这将是一个更好的策略。
列的顺序很重要。首先将用于相等比较的列放在索引中,然后将用于不等比较的列。
CREATE INDEX idxFld1Id ON `table` (fld_1, id);
另请参阅我的演示文稿如何设计索引,真的。
您可以使用http://www.percona.com/doc/percona-toolkit/pt-online-schema-change.html进行架构更改,例如创建索引——无需停机
当然,首先在您的数据库的测试副本上试用它,以了解如何使用该工具。
尝试通过替换您的索引名称 SELECT fld from table use index ( xxx
) WHERE id > 50000 AND fld_1 = 0 LIMIT 1000