2010-02-09 23 views
0

我有一個相當簡單的表格,稱爲窗口小部件。每一行都包含一個ID,描述和is_visible標誌:當標誌列是一個約束條件時,SELECT查詢速度很慢

CREATE TABLE `widgets` (
    `id` int auto_increment primary key, 
    `description` varchar(255), 
    `is_visible` tinyint(1) default 1 
); 

我想發出一個選擇可見光部件的一個子集的描述的查詢。下面簡單的查詢做的伎倆(其中nm是整數):

SELECT `description` 
    FROM `widgets` 
    WHERE (`is_visible`) 
ORDER BY `id` DESC 
    LIMIT n, m; 

不幸的是這個查詢,書面,必須掃描至少n+m行。有沒有辦法讓這個查詢掃描更少的行,通過重新查詢或修改模式?

回答

2

更快的查詢結果使用索引:

ALTER TABLE `widgets` ADD INDEX (`is_visible`) 
+0

該索引有幫助,但MySQL仍然需要掃描n + m行。我想知道是否有辦法讓MySQL掃描更少的行(最好是m行),但顯然給出了LIMIT的實現方式n + m是MySQL能做的最好的。 – jfpoole 2010-02-09 15:57:29

1

有沒有辦法讓這個查詢掃描更少的行?

不,不是真的。鑑於這是一個二進制標誌,您不會從在該字段上創建索引獲得太多好處。

我會詳細說明,給予downvote。

您必須考慮索引的基數(#個唯一值)。從MySQL手冊:

基數越高,MySQL進行連接時使用該索引的機會就越大。

在該字段將是2.它不會低得多。

參見:Why does MySQL not use an index on a int field that's being used as a boolean?
Indexing boolean fields

+0

由於該表具有可變長度的記錄,你可以從索引中獲益。 – 2010-02-09 04:11:55

相關問題