Mysql
使用列舉索引來限制記錄
一個常見的問題,只是不確定關鍵字。
我有一張評估表(14k+ 條記錄)。
每個評估都可以處於許多不同的狀態(“草稿”、“打樣”、“修改”等……和“完成”)。
大多數記錄(13k)都“完成”了……所以這樣做:
WHERE state != 'done'
它應該忽略大多數記錄,但是 MySQL 忽略索引(可能是由於低基數)。
我可以
USE/FORCE INDEX
,哪種幫助,但想知道這是否是最好的方法。一種選擇是在完成時添加一個
datetime
for,但目前並未真正使用……但具有高基數(NULL
對於那些 1k 記錄)。
=
雖然具有or<
或的類似查詢<=
將考慮(並且取決於基數估計將使用)在 上的索引(state)
,但具有這種類型條件的查詢將不使用索引。:WHERE state <> 'done'
你可以做的事情:
- 將條件寫為:
WHERE (state < 'done' OR state > 'done')
- 使用
UNION
:SELECT a.* FROM assessments AS a WHERE state < 'done' UNION ALL SELECT a.* FROM assessments AS a WHERE state > 'done' ;
IN
用/寫條件OR
:WHERE state IN ('draft', 'proofing', 'amends', ...) -- everything except 'done' WHERE (state = 'draft' OR state = 'proofing' OR state = 'amends' OR ...)