今天介紹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個.