type
status
date
slug
summary
tags
category
icon
password

warning 內容

情境

請參考 schema 如下
當代入 2 筆資料時,可以發現該查詢有正常使用 index
但是當代入 1000 筆資料時,會發現查詢變成 全表掃描,並且出現 warning

原因

notion image
該參數用來限制 range optimizer 的內存使用,當值為 0 時表示無限制。
假如優化器預計對查詢的優化為使用 range access method,但是當評估此方法需要消耗的內存超過限制時,則會 放棄 該執行計畫考慮其他計畫(包含全表掃描)。
對於一個範圍查詢,可以透過一下方式評估使用的內存數量:
  • 如下查詢,每一個 OR 大約占用 230 bytes。
    • 如下查詢,每一個 AND 結合約占用 125 bytes。
      • 當使用 IN 時,每一個值將會通過 OR 組合,但如下範例因為有兩個欄位,因為會結合出 M*NOR 結合。
        • 備註:在 5.7.11 之前,每一個 OR 約占用 700 bytes

      建議

      1. 盡量避免使用複合索引進行大量的 IN 查詢,在實測案例中單一欄位的索引可以 IN 超過一萬筆,但是複合索引測試中可能 1000 筆就失效了。
      1. 若真的需要使用,可以使用已下語句評估佔用了多少 memory

        延伸相關

        改為 SELECT 語法,可以在 EXPLAINWARNING 中發現 <cache> 字樣,證實了在這方面是需要用到內存的。
        另外此處還能看到 Bug #83856 ,根據 warning 說明是因為型態不同而無法使用 index,但實際執行跑出來的速度是有使用的,而且也沒有出現 warning,官方也將此 BUG 列為 S3(Non-critical) 等級,該 BUG 應該單純為顯示上的問題,下次看到可以不用太擔心。

        參考