请先右侧关注
持续分享SQL性能调优实战、SQL开发、MySQL原理、数据库设计等知识
今天在生产环境上遇到一个SQL 明明join表的关联字段上有索引,MySQL就是不走,由于版本又是8.0.13之前的版本。没有hash join 只能走BNL 让整个SQL奇慢无比
执行计划是这样的
执行需要93S 非常非常慢
但实际我在关联字段上不仅有索引,而且两表关联关系是1对1的。
我加了force index后 执行只需要 1.47S
为了弄清楚原因。我在测试环境进行了数据构造进行重现
构造测试数据
create table test1
(
table_schema varchar(50),
tablename varchar(200),
ver int,
id int primary key
);
create table test2
(
table_schema varchar(50),
tablename varchar(200),
ver int,
fromid int,
id int primary key
);
set @i:=0;
insert into test1(table_schema,tablename,ver,id)
select a.table_schema,a.table_name,a.version ,@i := @i+ 1 as id
from information_schema.tables a, information_schema.tables b;
set @i:=0;
insert into test2(table_schema,tablename,ver,id)
select a.table_schema,a.table_name,a.version ,@i := @i+ 1 as id
from information_schema.tables a, information_schema.tables b;
update test2 set fromid = 0;
update test2 set fromid = id where mod(id,2000000)= 0;
alter table test2 add index idx_fromid(fromid);
analyze table test2;
复制
explain
select * from test1 a
left join test2 b on a.id = b.fromid
where a.id <1000000
复制
重现了,因为我本地是8.0.32 有了hash join 所以显示了使用hash join
即使加use index 也无用 执行计划也和上面一模一样
explain
select * from test1 a
left join test2 b use index(idx_fromid) on a.id = b.fromid
where a.id <1000000
复制
执行需要178s
加上force index
explain
select * from test1 a
left join test2 b force index(idx_fromid) on a.id = b.fromid
where a.id <1000000
复制
执行只需要0.01S
出现这个问题的原因。MySQL估算行数严重错误。实际上因为100000以下的fromid都为0 ,一行都不符合。MySQL估算行数和区分度严重相关。因为我formid只有两个值,且偏移很大。200多W行数据 只有一行>0 其它都=0 而我的join 字段都是>0的。
**结论:以后当由于设计原因。区分度低,且数据分布极不均匀的,极有可能关联是不能走索引。需要开发在开发的时候就强制指定索引 force index **
最后修改时间:2024-03-21 20:50:51
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
文章被以下合辑收录
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1216次阅读
2025-03-13 11:40:53
MySQL8.0统计信息总结
闫建(Rock Yan)
450次阅读
2025-03-17 16:04:03
Ogg23ai高手必看-MySQL Innodb Cluster跟oracle的亲密接触
曹海峰
437次阅读
2025-03-04 21:56:13
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
436次阅读
2025-03-13 14:38:19
SQL优化 - explain查看SQL执行计划(一)
金同学
375次阅读
2025-03-13 16:04:22
MySQL突然崩溃?教你用gdb解剖core文件,快速锁定“元凶”!
szrsu
321次阅读
2025-03-13 00:29:43
MySQL生产实战优化(利用Index skip scan优化性能提升257倍)
chengang
307次阅读
2025-03-17 10:36:40
[MYSQL] xtrabackup备份报错Unable to obtain lock分析
大大刺猬
231次阅读
2025-02-28 16:43:00
一键装库脚本3分钟极速部署,传统耗时砍掉95%!
IT邦德
223次阅读
2025-03-10 07:58:44
MySQL8.0直方图功能简介
Rock Yan
210次阅读
2025-03-21 15:30:53