type
status
date
slug
summary
tags
category
icon
password
warning 內容
情境
請參考
schema
如下當代入
2
筆資料時,可以發現該查詢有正常使用 index但是當代入
1000
筆資料時,會發現查詢變成 全表掃描
,並且出現 warning
。原因

該參數用來限制
range optimizer
的內存使用,當值為 0
時表示無限制。假如優化器預計對查詢的優化為使用
range access method
,但是當評估此方法需要消耗的內存超過限制時,則會 放棄
該執行計畫考慮其他計畫(包含全表掃描)。對於一個範圍查詢,可以透過一下方式評估使用的內存數量:
- 如下查詢,每一個
OR
大約占用 230 bytes。
- 如下查詢,每一個
AND
結合約占用 125 bytes。
- 當使用
IN
時,每一個值將會通過OR
組合,但如下範例因為有兩個欄位,因為會結合出M*N
個OR
結合。
備註:在 5.7.11 之前,每一個
OR
約占用 700 bytes建議
- 盡量避免使用複合索引進行大量的 IN 查詢,在實測案例中單一欄位的索引可以 IN 超過一萬筆,但是複合索引測試中可能 1000 筆就失效了。
- 若真的需要使用,可以使用已下語句評估佔用了多少 memory
延伸相關
改為
SELECT
語法,可以在 EXPLAIN
的 WARNING
中發現 <cache>
字樣,證實了在這方面是需要用到內存的。另外此處還能看到 Bug #83856 ,根據 warning 說明是因為型態不同而無法使用 index,但實際執行跑出來的速度是有使用的,而且也沒有出現 warning,官方也將此 BUG 列為
S3(Non-critical)
等級,該 BUG 應該單純為顯示上的問題,下次看到可以不用太擔心。