我使用简单的JOIN
查询,但是MySQL在EXPLAIN
计划中继续显示错误的索引。
它选择不参与查询的列的索引。
查询基于主键。我尝试删除索引,然后优化器选择另一个不相关的索引。
在我的案例表中,a表示〜250万条记录,表b~500万条记录。 b中的每条记录都有~2条记录。
我正在使用MySql 5.6。
我在表格上做了ANALYZE
和CHECK
。
查询大约需要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
答案 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*/
;