iT邦幫忙

DAY 22
8

MySQL那些事兒系列 第 22

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

今天探討排序與索引.
人們喜歡有順序的資料,所以在資料庫的操作,排序是經常會使用的功能.
以第19天的AVDVD來當範例.
來觀察這道指令

EXPLAIN SELECT *
   FROM AVDVD
  ORDER BY avname\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: AVDVD
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 11
        Extra: Using filesort

Extra欄位有 Using filesort,代表資料庫先作一次擷取,還要額外再作一次排序,
這裡雖然是說 filesort,但不代表一定有使用暫存檔,會先用sort buffer來處理排序,
若不夠時會使用暫存檔補助.

接著再來觀察這道指令執行後,SESSION STATUS的變化.

FLUSH STATUS;

SELECT *
   FROM AVDVD
  ORDER BY avname;

SHOW SESSION STATUS LIKE '%sort%';

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Sort_merge_passes | 0     |
| Sort_range        | 0     |
| Sort_rows         | 11    |
| Sort_scan         | 1     |
+-------------------+-------+

可以看到排序了11筆資料,1次TABLE SCAN.

接著來看看有索引的情形.

EXPLAIN SELECT *
   FROM AVDVD
  ORDER BY avid\G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: AVDVD
         type: index
possible_keys: NULL
          key: PRIMARY
      key_len: 32
          ref: NULL
         rows: 11
        Extra: 

使用PRIMARY KEY,也不需作額外的動作如filesort.

觀察實際執行時,SESSION STATUS的變化.

FLUSH STATUS;

SELECT *
   FROM AVDVD
  ORDER BY avid;

SHOW SESSION STATUS LIKE '%sort%';

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Sort_merge_passes | 0     |
| Sort_range        | 0     |
| Sort_rows         | 0     |
| Sort_scan         | 0     |
+-------------------+-------+

不需動用額外的排序資源.

上一篇
關於索引的一些探討(七)
下一篇
MySQL 分組排名的方法
系列文
MySQL那些事兒30

2 則留言

我要留言

立即登入留言