iT邦幫忙

DAY 19
8

MySQL那些事兒系列 第 19

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

探討關於JOIN時,EXPLAIN顯示的欄位及其意義.
需要再建立一個Table.

CREATE TABLE AVDVD(
avid VARCHAR(10) NOT NULL PRIMARY KEY,
avname VARCHAR(50) NOT NULL,
galid INT UNSIGNED NOT NULL
);

INSERT INTO AVDVD(avid, avname, galid) VALUES
('IPTD-966', '犯された美人巨乳女教師', 1),
('IPTD-852', '爆乳家庭教師の猥褻レッスン', 1),
('BBI-146', 'ド淫乱浴衣美人の痴態', 2),
('BBI-136', '電撃復活', 2),
('DV-1314', '君と雨宿り', 4),
('DV-1231', '南国少女', 4),
('IPZ-138', 'ハメよん!カラダを張る女子アナSEX奮闘記', 3),
('IPZ-160', 'LOVE SEMEN', 3),
('IPZ-204', 'SUNBURST エロ過ぎる日焼けあと', 1),
('DV-1346', 'AVアイドル撮影会', 4),
('PGD-514', '美人OL痴漢地獄', 2);

來觀察尋找桜木凛的作品時,兩個Table JOIN,EXPLAIN產生的報告.

EXPLAIN SELECT g.name
      , g.birth_year
      , d.avname
   FROM AVGals g
  INNER JOIN AVDVD d
  USING (galid)
  WHERE g.name = '桜木凛'\G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: g
         type: ref
possible_keys: PRIMARY,name
          key: name
      key_len: 62
          ref: const
         rows: 1
        Extra: Using where
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: d
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 11
        Extra: Using where; Using join buffer

先是依據 AVGals Table 找出兩個可能的key, 分別是PRIMARY與name,使用name,
const代表是精確的,rows:1代表只處理一筆資料;接著是AVDVD Table的情形,
type:ALL,也沒有任何索引可以引用,全表掃描.

至於Using join buffer 是因為之前有另外下SELECT * FROM AVDVD;並未列出.
所以資料已經進到Buffer裡面了,這次可以利用Buffer裡的資料.
進了Buffer以後,後續的查詢會較快.所以我們看一道指令的效能,
不能光看執行速度,還要了解是否有使用到Buffer,
這樣才能夠比較清楚了解其狀況.

接著在AVDVD新增galid索引.

ALTER TABLE AVDVD
  ADD INDEX (galid);

再來觀察同樣的查詢的狀況.

EXPLAIN SELECT g.name
      , g.birth_year
      , d.avname
   FROM AVGals g
  INNER JOIN AVDVD d
  USING (galid)
  WHERE g.name = '桜木凛'\G


*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: g
         type: ref
possible_keys: PRIMARY,name
          key: name
      key_len: 62
          ref: const
         rows: 1
        Extra: Using where
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: d
         type: ref
possible_keys: galid
          key: galid
      key_len: 4
          ref: akina.g.galid
         rows: 1
        Extra: 

可以看到第二個TABLE AVDVD,有利用到galid這個索引,
並且是與第一個TABLE AVGals透過galid關聯參考,再利用
索引找出資料,整個過程較前面需要全表掃描,消耗資源較少,
速度也會較快.


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

1 則留言

0
SunAllen
iT邦好手 1 級 ‧ 2013-10-19 08:58:30

沙發

筆記筆記快點學~~

總裁 iT邦好手 1 級‧ 2013-10-19 10:14:31 檢舉

是要把片名學起來嗎??.....偷笑

ted99tw iT邦高手 1 級‧ 2013-10-19 10:44:27 檢舉

對呀,直接上雲端,留個種子先~偷笑

月半車甫 iT邦研究生 3 級‧ 2013-10-19 12:40:13 檢舉

我還以為是泰大的D槽哈哈

我要留言

立即登入留言