今天探討排序與索引.
人們喜歡有順序的資料,所以在資料庫的操作,排序是經常會使用的功能.
以第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     |
+-------------------+-------+
不需動用額外的排序資源.