我正在嘗試加快 mysql 查詢。Listings 表有幾百萬行。如果我稍后不對它們進行排序,我會在 0.1 秒內得到結果,但一旦我排序需要 7 秒。我可以改進什么來加快查詢速度?
SELECT l.*
FROM listings l
INNER JOIN listings_categories lc
ON l.id=lc.list_id
AND lc.cat_id='2058'
INNER JOIN locations loc
ON l.location_id=loc.id
WHERE l.location_id
IN (7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903)
ORDER BY date
DESC LIMIT 0,10;
解釋選擇:使用索引 l=date、loc=primary、lc=primary
uj5u.com熱心網友回復:
這樣的性能問題真的很難回答,并且取決于設定、索引等。因此,可能不會有唯一的解決方案,甚至沒有真正正確或不正確的嘗試來提高速度。這是一次嘗試和錯誤的嘗試。無論如何,我注意到的一些經常導致性能問題的點是:
- 避免連接中的條件應該放在 where 中。連接應該只包含將要連接的列,沒有其他條件。所以“lc.cat_id='2058”應該放在where子句中。
- 使用 IN 通常很慢。您可以嘗試使用 OR (l.location_id = 7841 OR location_id = 7842 OR...) 替換它
- 打開查詢執行計劃并檢查是否有對您有用的東西。
- 嘗試找出受影響的列中是否有特殊情況/值會減慢查詢速度
- 將“ORDER BY date”更改為“ORDER BY tablealias.date”并檢查這是否會影響性能。即使沒有,也最好閱讀。
- 如果您可以將列重命名為“日期”,請這樣做,因為使用 SQL 關鍵字作為表名或列名不是一個好主意。我不確定這是否會影響性能,但應盡可能避免。
祝你好運!
uj5u.com熱心網友回復:
您可以嘗試使用附加索引來加快查詢速度,但在創建/操作資料時需要進行權衡。
這些組合鍵可以加快查詢速度:
listings: date, location_id
listings_categories: cat_id, list_id
由于計劃說它使用日期索引,因此在使用新索引時不需要讀取記錄來檢查 location_id,對于使用 listings_category 的連接也是如此,索引讀取就足夠了
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/461713.html
標籤:mysql 表现 sql-order-by 内部联接
下一篇:使用sql,根據條件查找上一行
