iT邦幫忙

DAY 18
9

MySQL那些事兒系列 第 18

關於索引的一些探討(四)

今天介紹EXPLAIN顯示的一些欄位的意義.
安排了大家喜聞樂見的一些測試資料.
建立測試資料.

CREATE TABLE AVGals(
galid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
birth_year YEAR DEFAULT NULL
);

INSERT INTO AVGals(name, birth_year) VALUES
('初音みのり', 1987),
('桜木凛', 1989),
('希崎ジェシカ', 1989),
('葵つかさ', 1990);

目前未建立以姓名欄位的索引,查詢姓名的情況.

EXPLAIN SELECT *
   FROM AVGals
  WHERE name = '初音みのり'\G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: AVGals
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 4
        Extra: Using where
1 row in set (0.00 sec)

可以看到沒使用任何key,type是ALL,處理的資料有4筆,
就是全表掃描了,在資料量大時,效率不高.

增加以姓名欄位為key的索引.

ALTER TABLE AVGals
  ADD INDEX (name);

再次觀察同樣的查詢
EXPLAIN SELECT *
   FROM AVGals
  WHERE name = '初音みのり'\G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: AVGals
         type: ref
possible_keys: name
          key: name
      key_len: 62
          ref: const
         rows: 1
        Extra: Using where
1 row in set (0.00 sec)

使用了name欄位來查詢,type是ref, ref 是 const, 
代表是使用了索引,並且是精確的.
只處理了一筆資料,效率較高.

接著建立出生年的索引.
ALTER TABLE AVGals
  ADD INDEX (birth_year);

觀察查詢1989出生的.
EXPLAIN SELECT *
   FROM AVGals
  WHERE birth_year = 1989\G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: AVGals
         type: ref
possible_keys: birth_year
          key: birth_year
      key_len: 2
          ref: const
         rows: 2
        Extra: Using where
1 row in set (0.00 sec)

一樣可以看到是使用了索引,並且是精確的.
只處理了2筆資料.

若再增加一個同樣的索引會怎樣呢?

ALTER TABLE AVGals
  ADD INDEX (birth_year);

EXPLAIN SELECT *
   FROM AVGals
  WHERE birth_year = 1989\G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: AVGals
         type: ref
possible_keys: birth_year,birth_year_2
          key: birth_year
      key_len: 2
          ref: const
         rows: 2
        Extra: Using where
1 row in set (0.00 sec)

可以觀察到我們若未幫索引命名,
MySQL會自動幫INDEX命名,會新增代號,讓我們可以區分.
這裡就出現2個可能的索引,使用了第1個.

上一篇
關於索引的一些探討(三)
下一篇
關於索引的一些探討(五)
系列文
MySQL那些事兒30

1 則留言

我要留言

立即登入留言