我有一个大约17M行的MySQL表,我最终做了很多聚合查询。
对于此示例,我可以说我有index_on_b
,index_on_c
,compound_index_on_a_b
,compound_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首先选择复合索引吗?
答案 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