日志:MySQL 百万级数据表使用了错误索引的解决方法

本文讲述了作者在处理线上SQL运行缓慢问题时,发现由于错误的索引使用导致查询效率低下。通过尝试调整Cardinality计算、设置max_seeks_for_key变量以及使用FORCE INDEX,最终发现表结构不合理是问题根源。通过字段重构,有效解决了索引误用问题,大幅减少了数据量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开门见山

今天偶然发现线上一SQL运行缓慢

druid监控页面
druid 监控

最慢的时候达到了 30.8 秒。

SQL代码段:

SELECT
	id,
	injection_machine_id,
	value_code,
	`value`,
	sample_time
FROM
	`表` 
WHERE
	injection_machine_id = 26100 
ORDER BY
	sample_time DESC 
	LIMIT 1

经查,数据库中存在完全符合的索引 idx_machine_time(索引顺序为:injection_machine_id,sample_time),但使用的却是 idx_time(单列 sample_time)。

注意:以下尝试在你的机器上都可以尝试一下,对你可能是有用的噢

尝试1

于是我将该表导出(包含结构和数据)放到了我本地测试服务器,EXPLAIN 同样的 SQL,并查看了二者的索引详情后,发现二者的 Cardinality 有较大差别:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值