为什么MySQL在JOIN查询中选择了错误的索引?

时间:2013-11-20 10:40:51

标签: mysql performance join explain

我使用简单的JOIN查询,但是MySQL在EXPLAIN计划中继续显示错误的索引。

它选择不参与查询的列的索引。

查询基于主键。我尝试删除索引,然后优化器选择另一个不相关的索引。

在我的案例表中,a表示〜250万条记录,表b~500万条记录。 b中的每条记录都有~2条记录。

我正在使用MySql 5.6。

我在表格上做了ANALYZECHECK

查询大约需要70秒,它使用错误的索引并执行嵌套循环,为什么?

SELECT 
IFNULL(SUM(a.val),0) as total
FROM a , b
where a.id = b.a_id;

1   SIMPLE  a   index   PRIMARY idx_a_c_id  5       2406691 Using index
1   SIMPLE  tv  ref idx_a_id idx_a_id   4   capb_1.a.id 1

# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 'spd_transaction', 'index', 'PRIMARY', 'idx_a_c_id', '5', NULL, '2406691', 'Using index'
'1', 'SIMPLE', 'tv', 'ref', 'idx_a_id', 'idx_a_id', '4', 'a.id', '1', NULL

1 个答案:

答案 0 :(得分:1)

1)看看SQL的本质(没有谓词),我建议使用提示(我不经常鼓励)忽略索引并强制数据库引擎使用FTS(全表扫描)。

在这种情况下,FTS优于使用任何索引。

SELECT 
IFNULL(SUM(a.val),0) as total
FROM a , b USE INDEX /* Specify no index here to ignore index and force FTS*/
where a.id = b.a_id;

我不建议删除表上的索引,因为我不知道它们在你的应用程序的其他地方使用过。

2)我还建议删除表'B'上的JOIN,因为SQL没有在输出中使用这个代价高的大表JOIN。

SELECT 
IFNULL(SUM(a.val),0) as total
FROM a USE INDEX /* Specify no index here to ignore index and force FTS*/
;