优化案例1:我的sql如下:
explain SELECT name,sex,birthday,
GROUP_CONCAT(exam_time SEPARATOR ';') examTime,
GROUP_CONCAT(age SEPARATOR ';') age,
GROUP_CONCAT(height SEPARATOR ';') height,
GROUP_CONCAT(weight SEPARATOR ';') weight,
GROUP_CONCAT(kjj SEPARATOR ';') kjj,
GROUP_CONCAT(hjj SEPARATOR ';') hjj,
GROUP_CONCAT(left_bone SEPARATOR ';') left_bone,
GROUP_CONCAT(right_bone SEPARATOR ';') right_bone,
GROUP_CONCAT(left_foot SEPARATOR ';') left_foot,
GROUP_CONCAT(left_length SEPARATOR ';') left_length,
GROUP_CONCAT(left_wide SEPARATOR ';') left_wide,
GROUP_CONCAT(right_foot SEPARATOR ';') right_foot,
GROUP_CONCAT(right_length SEPARATOR ';') right_length,
GROUP_CONCAT(right_wide SEPARATOR ';') right_wide,
GROUP_CONCAT(sport_flag SEPARATOR ';') sport_flag
FROM eb_examination ex
where 1=1
and exam_time>='2024-12-16' and exam_time <='2025-12-16'
AND (select count(0) from eb_examination where exam_time>='2024-12-16' and exam_time <='2025-12-16'
and name =ex.name and sex=ex.sex and birthday =ex.birthday )>1
GROUP BY name,sex,birthday
ORDER BY exam_time desc
直接查询速度特别慢,因为使用了子查询我按照子查询的顺序创建了复合索引,速度是变快了一点,但是还是慢,explain显示ex表还是使用的是ALL,再给主表新建一个复合索引顺序是name,sex,birthday,exam_time,速度立马提升
案例二:select xx from A where status !='2' and type ='201' and xxx
查询速度比较慢,思考:给两个分别加上索引,还是加上复合索引?
1、首先考虑给等值字段添加索引,explain发现是ref,
2、给status加上索引,则是range,这种是范围查询, ref>range
3、给两个字段加上复合索引,也是range,(复合索引会占用更多的存储空间,而且此时也是range)
综合考虑,给type单一加上索引就可以
实际需要考虑:比如type='201'数据量占比多不多,不一定ref就比range快,
总结: 虽然单索引显示为ref而复合索引显示为range,但不要被这个表面现象迷惑。range不一定比ref差,关键看实际扫描的行数和回表成本。复合索引在大多数情况下都是更好的选择。
mysql 查询的执行顺序:from where group by having select order by
首先我们要明白几点、优化sql其实也就是优化索引,以及减少对数据库的访问,尽量通过Java去操作,尽量不用很长很复杂的sql去执行,拆分为多个sql,如果表有升级记得删除索引重新加上索引
注意sql查询慢的原因一般都是:引起filesort文件排序,增加磁盘io消耗
对于慢sql的记录我们可以开启慢查询日志

一、Order by排序优化
当需要对age,money进行排序时可以加上复合索引,然后 select id,age,money from eap order by age,m

最低0.47元/天 解锁文章
11万+

被折叠的 条评论
为什么被折叠?



