2012-01-24 75 views
3

有誰知道MySQL的解釋輸出

之間的區別使用索引

使用其中;使用索引

mysql的解釋輸出(在額外)?

繁殖:

CREATE TABLE `tmp_t1` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `a` int(11) NOT NULL DEFAULT '0', 
    `b` varchar(50) CHARACTER SET latin1 NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`), 
    KEY `k1` (`a`), 
    KEY `k2` (`b`) 
) ENGINE=InnoDB AUTO_INCREMENT=5; 

insert into tmp_t1 (a,b) values (1,'b1'), (1, 'b2'), (2, 'b3'); 

的MySQL>解釋SELECT COUNT(1)從tmp_t1其中a = 1 \ G變

*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: tmp_t1 
     type: ref 
possible_keys: k2,kz 
      key: kz 
     key_len: 4 
      ref: const 
     rows: 3 
     Extra: Using index 
1 row in set (0.11 sec) 

的MySQL>從tmp_t1其中b(1)解釋選擇計數='b1'\ G

*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: tmp_t1 
     type: ref 
possible_keys: k3 
      key: k3 
     key_len: 52 
      ref: const 
     rows: 2 
     Extra: Using where; Using index 
1 row in set (0.00 sec) 

有沒有人知道爲什麼在第一種情況下re只是在額外的領域使用索引,而在第二個是「使用where;使用索引」? 這兩種情況之間的區別在於第一種情況在整數上運行WHERE,第二種情況在varchar(50)字段上執行。 但它爲什麼重要?

感謝您的幫助!

+0

'使用where'說,有一個過濾器(='WHERE'條款),在SQL。 '使用索引'表示查詢使用索引。兩者都是不同的東西。我不明白這個問題。 – Kaii

+0

問題是mysql爲什麼只使用索引來執行第一個查詢,而爲了執行查詢第二個「使用where」被報告。我問,因爲我無法理解這兩個查詢之間的區別 - 一個使用在條件的整數,而另一個爲varchar字段的事實如何影響MySQL的方式執行這些(爲什麼第二個查詢不使用「index only」?) –

+0

在第一個EXPLAIN中提到並實際使用的'kz'索引是什麼? – newtover

回答

3

我應確認的區別是非常混亂確實如此。在其他情況下,Using where; Using index可能表示索引已被使用,但已完整掃描。就像你在(a,c)上有一個複合索引,但是查詢如SELECT a FROM thetable WHERE c = 1一樣。在這種情況下,MySQL將使用索引(因爲它包含了所有必要的數據並且在內存中),但是會對索引執行完整掃描。

至於導致你應該看到,在

SHOW STATUS LIKE 'Handler_read_next'; 

變量將增加至數表中的行的。

但是,這不是爲查詢的情況:

select count(*) from tmp_t1 where b='b1'; 

它檢查索引列的確切人數。我認爲這是某種錯誤或特徵,還有一個證據表明,結果EXPLAIN本身並不是什麼依賴的東西。有趣的是,查詢大型表的,用綜合指數在VARCHAR是第二個索引EXPLAIN有時不顯示Using where。我很困惑。

+0

感謝您介紹'Handler_read_ *'狀態變量的世界。 –

0

使用凡

甲WHERE表達(在附加到可能的鍵查找)用於檢查是否該行應該被接受。如果你沒有與所有的連接類型一起使用'Where',你可能做錯了!

使用索引

僅索引用於從表中檢索所需的信息。沒有必要執行額外的查找來檢索實際記錄。

+0

我沒有JOIN,只有一個簡單的條件(我在上面的原始問題中添加了schema和sql命令)。 –

+0

那麼只有第一部分是適用於WHERE表達(在附加到可能的鍵查找)用於檢查是否該行應該被接受您的explain輸出即 甲。 –

0

「使用索引」意味着只有索引用於執行實際查詢(查找要返回的行),這意味着mysql不需要讀取實際的行。

列信息從利用在索引樹僅 信息的表中檢索,而不必做額外尋求 讀取實際行。當查詢僅使用 列作爲單個索引的一部分時,可以使用此策略。

「使用,其中」意味着做數據查找時(它需要返回行,找到你所選擇的列中的相應數據)

如果額外列的索引也使用還說在哪裏使用,這意味着索引是 用於查找關鍵值。不使用其中的 優化可讀取索引,以避免讀取數據行,但不 用它來查找。例如,如果索引是查詢的覆蓋索引 ,那麼優化程序可以掃描它而不用它進行查找。

Source in mysql's documentation(搜索「使用索引」)