2011-08-10 67 views
0

如果我有如下表:爲什麼MySQL不會使用我的索引?

CREATE TABLE `mytable` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(64) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `name_first_letter` (`name`(1)), 
    KEY `name_all` (`name`) 
) 

將MySQL的不斷選擇通過name_all指數使用name_first_letter指數?如果是這樣,在什麼情況下會發生?

我已經做了一些快速測試,我不知道如果MySQL甚至會選擇name_first_letter指數使用索引提示時:

-- This uses name_all 
EXPLAIN SELECT name FROM mytable 
WHERE SUBSTRING(name FROM 1 FOR 1) = 'T'; 

-- This uses no index at all 
EXPLAIN SELECT name FROM mytable USE INDEX (name_first_letter) 
WHERE SUBSTRING(name FROM 1 FOR 1) = 'T'; 

任何MySQL的大師們都可以闡明這一些輕?這個專欄上有沒有關於name_first_letter的點?

編輯:問題標題不太對。

回答

2

因爲您正在選擇全名列,所以使用索引進行查詢是沒有意義的。這意味着MySQL不能單獨使用索引來滿足查詢。

此外,我相信MySQL不能理解SUBSTRING(name FROM 1 FOR 1)表達式等同於索引。

但是,如果索引本身可以滿足查詢,MySQL可能會使用該索引。例如:

select count(*) 
    from mytable 
where name like 'T%'; 

但即使這取決於你的統計(暗示應該工作)。

MySQLs部分索引功能旨在節省空間。它(通常)沒有意義同時具有部分和全部列索引。你通常會選擇較短的一個。可能有一個罕見的情況下,它是有道理的,但一般來說沒有意義。