Mysql in查詢慢優化方法

表總共記錄800w:

           mysql中in集合中只有20個左右,查詢時間大約6s,無法走索引

           例如:

SELECT
 sum(num)
FROM
 `****`
WHERE
 `create_time` >= 1584892800
AND `create_time` < 1584979200
AND `source` = 5
AND `uid` IN (
 23, 24, 26, 29, 32, 33, 38, 42, 52, 59, 68, 69, 71, 72, 73, 79, 83,
 85, 108, 111, 139, 229, 261, 280, 281, 283, 296, 298, 308, 401, 423,
 490, 523, 650, 653, 776, 903, 913, 966, 997, 1030, 1381, 1704, 1809)
AND `coin_id` = 1
LIMIT 1

原因1:in中結合條件太多,mysql認爲全表檢索比索引要快,就不走索引了;

原因2:mysql參數eq_range_index_dive_limit設置太小,導致in不走索引

解決方案:

1.語句強制走索引,tp5可以db('*** force index(idx_x5)')即可強制走索引

SELECT
 sum(num)
FROM
 `****` force index(idx_x5)
WHERE
 `create_time` >= 1584892800
AND `create_time` < 1584979200
AND `source` = 5
AND `uid` IN (
 23, 24, 26, 29, 32, 33, 38, 42, 52, 59, 68, 69, 71, 72, 73, 79, 83,
 85, 108, 111, 139, 229, 261, 280, 281, 283, 296, 298, 308, 401, 423,
 490, 523, 650, 653, 776, 903, 913, 966, 997, 1030, 1381, 1704, 1809)
AND `coin_id` = 1
LIMIT 1

2.eq_range_index_dive_limit參數調大到200,sql即可自動走索引,不用強制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章