MySQL:SQL优化实际案例解析(持续更新)
一、MySQL:SQL优化
1、时间格式化问题(字符串)
-- 优化前
SELECT
*
FROM
test_table
WHERE date_format( begin_time, '%Y-%m-%d' ) = '2025-03-12'
-- 优化:
-- 1、加上begin_time字段为普通索引,并且优化了sql
SELECT
*
FROM
test_table
WHERE begin_time between concat('2025-03-12', ' 00:00:00') and concat('2025-03-12', ' 23:59:59')
原理解释:
在where条件中对字段进行函数操作,即使加了索引也会导致索引失效,最终是走全表扫描!
如果使用between,全表扫描会变成范围搜索,索引就会正常使用了!
如果是mysql8版本,可以考虑使用函数索引
!
2、in/inner join的问题
-- 优化前
SELECT
*
FROM
test_table
WHERE
id IN (
SELECT
max( id )
FROM
test_table
GROUP BY
DATE_FORMAT( begin_time, '%H时' )
)
-- 优化后
SELECT
*
FROM
test_table t1
inner join (
SELECT
max( id ) id
FROM
test_table
GROUP BY
DATE_FORMAT( begin_time, '%H时' )
) t2 on t1.id = t2.id
原理解释:
mysql5版本,对于in并不是很友好,in参数过多就会走全表扫描。而8版本对in做了优化。
如果用的是mysql5版本,in的过程比较慢,或许尝试用join操作来代替in可能会有奇效!
同时,看情况用exists等能够替代in的方式。