一、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 (SELECTmax( id )FROMtest_tableGROUP BYDATE_FORMAT( begin_time, '%H時' ))
-- 優化后
SELECT
*
FROM
test_table t1
inner join (SELECTmax( id ) idFROMtest_tableGROUP BYDATE_FORMAT( begin_time, '%H時' )) t2 on t1.id = t2.id
原理解釋:
mysql5版本,對于in并不是很友好,in參數過多就會走全表掃描。而8版本對in做了優化。
如果用的是mysql5版本,in的過程比較慢,或許嘗試用join操作來代替in可能會有奇效!
同時,看情況用exists等能夠替代in的方式。