我有一個查詢。如下當大數據受到影響時,索引不起作用
SELECT SUM(principalBalance) as pos, COUNT(id) as TotalCases,
SUM(amountPaid) as paid, COUNT(amountPaid) as paidCount,
SUM(amountPdc) as Pdc, SUM(amountPtp), COUNT(amountPtp)
FROM caseDetails USE INDEX (updatedAt_caseDetails)
WHERE updatedAt BETWEEN '2016/06/01 00:00:00' AND '2016/06/30 23:59:00'
它有效地使用索引。截圖結果屏幕截圖: 日期範圍'2016/06/01 00:00:00'和'2016/07/26 23:59:00'中有154500條記錄。
但是,當我作爲,
SELECT SUM(principalBalance) as pos, COUNT(id) as TotalCases, SUM(amountPaid) as paid, COUNT(amountPaid) as paidCount, SUM(amountPdc) as Pdc, SUM(amountPtp), COUNT(amountPtp) FROM caseDetails USE INDEX (updatedAt_caseDetails) WHERE updatedAt BETWEEN '2016/06/01 00:00:00' AND '2016/07/30 23:59:00'
現在,這是不使用索引提高數據的範圍。結果解釋屏幕截圖: 在日期範圍'2016/06/01 00:00:00'和'2016/07/30 23:59:00'
增加日期範圍查詢不再使用索引,所以它變得太慢了。即使在我被迫使用索引之後。我無法弄清楚爲什麼會發生這種情況,因爲查詢和索引都沒有變化。你能幫我知道爲什麼會發生這種情況嗎?
嘗試使用'force index'而不是'use index'。但一般來說,假設你的數字是正確的,總結20倍的行數當然會更慢。那麼「太慢」的速度有多慢(與其他情況相比)?你在該表中總共有多少行?它可能實際上是一個全表掃描通過索引超過300萬行查找(除非它是一個覆蓋索引,包括您在該查詢中使用的所有列,例如'principalBalance',因此不需要讀取之後的桌子)。 – Solarflare
感謝@Solarflare的輸入。我試過這個,查詢使用索引,但它的處理速度仍然很慢。 –
是的,正如我所說的,如果你有20倍的行數(300萬而不是150k),它應該會變慢。如果它需要的時間少於第一個查詢的20倍,那麼選擇不同的索引是MySQL的一個好主意,並且強制索引可能比以前更慢。你可以嘗試一個完整的覆蓋索引(索引'(update_at,principalBalance,amountPaid,...,amountPtp)'。這個查詢應該更快,但是與所有索引一樣,它會減慢更新/插入,並且會需要空間 – Solarflare