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