表總共記錄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即可自動走索引,不用強制