一個多條件查詢sql,表資料量 280萬,46個欄位。
這是sql:
SELECT
c.*
FROM
b_car c
WHERE c.enterpriseCode = '20180403001'
AND c.assign = 0
AND c.lastCityId IN ('320000')
AND c.lastCompanyCode IN ('PICC')
AND c.lastEndDate >= '2018-05-17'
AND c.lastEndDate <= '2018-05-31'
ORDER BY c.createDate ASC
LIMIT 0, 1
我在enterpriseCode ,assign 這兩列建立了組合索引名 b_car_enterpriseAssign。表原本還有其他索引 createDate 索引名 b_car_createDate。
默認 走的是 b_car_createDate。查詢耗時 14秒。 explain 結果如下:

強制使用索引 b_car_enterpriseAssign。
select c.* from b_car c
force index(b_car_enterpriseAssign)
WHERE c.enterpriseCode = '20180403001'
AND c.assign = 0
AND c.lastCityId IN ('320000')
AND c.lastCompanyCode IN ('PICC')
AND c.lastEndDate >= '2018-05-17'
AND c.lastEndDate <= '2018-05-31'
ORDER BY c.createDate ASC
LIMIT 0, 1
查詢耗時 0.268秒。 explain 結果如下:

沒辦法,現階段只能在程式里面,sql 強制指定索引b_car_enterpriseAssign,想咨詢下專業的資料庫大牛,為什么沒有走新建的索引,而且怎么樣優化下 比較好,sql里面 強制指定 索引 這個不好。
uj5u.com熱心網友回復:
你的b_car表的lastEndDate欄位,在資料庫中存盤的應該是Timestamp型別的吧,比較大小的時候,從頁面傳過來的值用TO_DATE統一轉換為data型別,進行比較這樣查詢會快一點
uj5u.com熱心網友回復:
把 排序欄位也加入你的索引,做個復合索引吧uj5u.com熱心網友回復:
把order by c.createDate 欄位加入復合索引uj5u.com熱心網友回復:
看不到您的資料分布情況,但是可以試試如下的操作:1、將所有的IN,換成=。
2、c.lastEndDate >= '2018-05-17' AND c.lastEndDate <= '2018-05-31' 換成c.lastEndDate BETWEEN '2018-05-17' AND '2018-05-31'
3、看看你用到的所有,講差異最大的欄位,放在索引的前邊。
uj5u.com熱心網友回復:
貼出表結構看一下吧uj5u.com熱心網友回復:
來看下我的優化的文章吧!哈哈哈,今天剛寫的https://blog.csdn.net/gyp0307/article/details/80345807
uj5u.com熱心網友回復:
b_car_createDate索引有哪些欄位啊轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/87989.html
標籤:MySQL
