Mysql

使用列舉索引來限制記錄

  • September 26, 2013

一個常見的問題,只是不確定關鍵字。

我有一張評估表(14k+ 條記錄)。

每個評估都可以處於許多不同的狀態(“草稿”、“打樣”、“修改”等……和“完成”)。

大多數記錄(13k)都“完成”了……所以這樣做:

WHERE state != 'done'

它應該忽略大多數記錄,但是 MySQL 忽略索引(可能是由於低基數)。

我可以USE/FORCE INDEX,哪種幫助,但想知道這是否是最好的方法。

一種選擇是在完成時添加一個datetimefor,但目前並未真正使用……但具有高基數(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 ...) 

引用自:https://dba.stackexchange.com/questions/50557