2

我有一个看起来像的查询

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

4

2 回答 2

3

我不知道有什么方法可以强制索引合并。该手册页上的条件描述了可以完成索引合并的条件,如果可以的话,优化器应该自动完成(并且如果基于成本的优化器认为这样做是值得的)。如果不可能,您不能强制索引合并。

但无论如何,复合索引通常比索引合并执行得更好,所以这将是一个更好的策略。

列的顺序很重要。首先将用于相等比较的列放在索引中,然后将用于不等比较的列。

CREATE INDEX idxFld1Id ON `table` (fld_1, id);

另请参阅我的演示文稿如何设计索引,真的


您可以使用http://www.percona.com/doc/percona-toolkit/pt-online-schema-change.html进行架构更改,例如创建索引——无需停机

当然,首先在您的数据库的测试副本上试用它,以了解如何使用该工具。

于 2013-04-17T00:52:48.953 回答
0

尝试通过替换您的索引名称 SELECT fld from table use index ( xxx) WHERE id > 50000 AND fld_1 = 0 LIMIT 1000

于 2013-04-05T06:35:24.057 回答