为MySQL配置更好的索引选择

时间:2016-01-27 20:30:42

标签: mysql indexing

我有一个大约17M行的MySQL表,我最终做了很多聚合查询。

对于此示例,我可以说我有index_on_bindex_on_ccompound_index_on_a_bcompound_index_on_a_c

我尝试运行查询解释

EXPLAIN SELECT SUM(revenue) FROM table WHERE a = some_value AND b = other_value

我发现所选索引是index_on_b,但是当我使用查询提示时

SELECT SUM(revenue) FROM table USE INDEX(compound_index_on_a_b)

查询运行速度更快。我可以在MySQL配置中做些什么来让MySQL首先选择复合索引吗?

2 个答案:

答案 0 :(得分:1)

您可以选择2条路线:

A)索引解析过程是根据优化器根据创建索引的顺序,所有事情都是相等的。您可以删除index_b并重新创建它并检查优化器是否处于它认为它们的场景中是一样的。

或者

B)使用optimizer_search_depth(参见https://mariadb.com/blog/setting-optimizer-search-depth-mysql)。通过更改此参数,您可以确定优化程序可以在查询计划上花费多少精力,并且可能会提供使用组合索引的更好解决方案。

答案 1 :(得分:0)

可能的解释:

如果a在整个表格中具有相同的值,则INDEX(b)实际上优于INDEX(a,b)。这是因为前者较小,因此使用起来更快。请注意,即使不进一步检查a,两者都会返回相同的行数。

请提供:

SHOW CREATE TABLE
SHOW INDEXES  -- to see cardinality
EXPLAIN SELECT