gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:40:00 26 4
gpt4 key购买 nike

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

它在不参与查询的列上选择一个索引。

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

在我的例子中,表 a 包含约 250 万条记录,表 b 包含约 500 万条记录。 a 中的每条记录在 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) 查看 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*/
;

关于mysql - 为什么 MySQL 在 JOIN 查询中选择了错误的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20093635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com