簡體   English   中英

MySQL索引char(1)列

[英]MySQL indexing char(1) columns

我有一個帶有復雜查詢的表,我正在尋求優化,我閱讀了大多數有關MySQL索引的文檔..但是在這種情況下,我不確定該怎么做:

數據結構:

-- please, don't comment on the field types and names, it is outsourced project.

CREATE TABLE items(
  record_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  solid CHAR(1) NOT NULL, -- only 'Y','N' values
  optional CHAR(1) NULL, -- only 'Y','N', NULL values
  data TEXT
 );

查詢:

SELECT * FROM items
WHERE record_id != 88
AND solid = 'Y'
AND optional !='N'  -- 'Y' OR NULL

當然,還有額外的聯接和相關數據,但這是最大的過濾器。

在以下情況下:
-20萬多個記錄,
-10%(占全部),其中solid =“ Y”,
-10%(占全部),帶有optional !='N',

什么是該查詢的良好索引?
或更確切地說:

  • 第一條檢查記錄!= 88是否以任何方式減慢了查詢速度?
    (它只會消除一個結果...?)

  • 這是更快的( optional !='N')或('可選'='Y'或'可選'iS NULL)
    如上所述, optional ='N'是總數的10%。

  • 有僅2個可能值的索引CHAR(1)列有什么特別的地方嗎?

  • 我可以使用此索引(record_id,固體,可選)嗎?

  • 如何為特定值創建索引(實體='Y',可選!='N')?


按照@Jack的要求,當前EXPLAIN結果(總共30 000行中有20個結果):

+-------------+-------+--------------+---------+---------+------+-------+-------------+
| select_type | type  | possible_key |   key   | key_len | ref  | rows  |    Extra    |
+-------------+-------+--------------+---------+---------+------+-------+-------------+
| PRIMARY     | range | PRIMARY      | PRIMARY |       4 | NULL | 16228 | Using where |
+-------------+-------+--------------+---------+---------+------+-------+-------------+

這是個有趣的問題。 總體而言,您的查詢的選擇性約為1%。 因此,如果一個頁面上可容納100條記錄,那么您將假設即使具有索引,仍必須讀取每一頁。 由於記錄非常小(取決於實際data ),因此很有可能。 從這個角度來看,索引是不值得的。

在以下情況下,索引是值得的。 第一個是索引為覆蓋索引時,這意味着您可以使用索引中的所有列來滿足查詢。 例如:

select count(*)
FROM items
WHERE record_id != 88 AND solid = 'Y' AND optional !='N'  -- 'Y' OR NULL

索引在solid, optional, record_id 該查詢不需要返回到原始數據頁面。

另一種情況是索引是主索引(或聚集索引)時。 數據以該順序存儲,因此獲取有限數量的結果將減少查詢的讀取開銷。 缺點是更新和插入的成本更高,因為數據實際上必須移動。

在您的情況下,我最好的猜測是除非data很大(在千字節范圍內),否則索引將無用。

您應該嘗試將索引放在最能區分的列上。 如果數據庫在值之間平均分配,則通常對二進制列建立索引不是很有用。 但是,如果您經常搜索的值僅在10%的時間出現,那么它可能是一個有用的索引。

如果對任何列進行了索引,通常將在進行任何其他WHERE處理之前檢查它們。 將條件放在WHERE子句中的順序通常不相關。 您可以使用EXPLAIN找出查詢使用的索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM