我通過「高性能MySQL」書籍學習MySQL索引詳細信息,但我無法理解一件事。使用MySQL索引掃描進行排序
正如書上說的,(第124頁使用索引掃描的排序)
MySQL有兩種方法可以產生有序的結果:它可以使用文件排序, 或者也可以以掃描的索引。
僅當索引的順序爲 與ORDER BY子句完全相同,並且所有列按相同方向(升序或降序)排列在 中時,纔會按索引排序結果。
ORDER BY子句也具有與查找查詢相同的限制:它需要形成索引的最左邊的前綴。在其他所有情況下,MySQL使用文件夾 。
進一步,作者給出了使用MySQL的Sakila的例子數據庫 [http://dev.mysql.com/doc/sakila/en/][1]
第一個例子能正常工作的一些例子:
標準的Sakila示例數據庫租金錶上 (rental_date指數, inventory_id,CUSTOMER_ID):
CREATE TABLE rental (
...
PRIMARY KEY (rental_id),
UNIQUE KEY rental_date (rental_date,inventory_id,customer_id),
KEY idx_fk_inventory_id (inventory_id),
KEY idx_fk_customer_id (customer_id),
KEY idx_fk_staff_id (staff_id),
...
);
MySQL使用rental_date索引對下面的查詢,如您 可以從缺少文件排序的看到EXPLAIN:
> mysql> EXPLAIN SELECT
> rental_id, staff_id FROM sakila.rental
> -> WHERE rental_date = '2005-05-25'
> -> ORDER BY inventory_id, customer_id\G
> *************************** 1. row ***************************
> type: ref
> possible_keys: rental_date
> key: rental_date
> rows: 1
> Extra: Using where
這工作,即使ORDER BY子句本身不是 索引的最左邊的前綴,因爲我們爲索引中的第一列指定了相等的 條件。
重要的是要注意:它們在where子句中使用索引列,但在SELECT查詢中使用不同的列。
第二個例子示於短的方式:
以下查詢也適用,因爲在ORDER兩列BY 是最左邊的前綴索引:
.. 。WHERE rental_date>'2005-05-25'ORDER BY rental_date,inventory_id;
但在這裏你可以得到不同的結果,而你的選擇列內容:
第一種情形,文件排序時:
EXPLAIN
SELECT `rental_id`, `staff_id` FROM `sakila`.`rental`
WHERE `rental_date` > '2005-05-25'
ORDER BY `rental_date`, `inventory_id`;
類型:所有 possible_key:rental_date
鍵:NULL 額外:使用where;使用文件排序
第二種情況下,索引用於:
EXPLAIN
SELECT `rental_id`, `rental_date`, `inventory_id` FROM `sakila`.`rental`
WHERE `rental_date` > '2005-05-25'
ORDER BY `rental_date`, `inventory_id`;
類型:範圍 possible_key:rental_date 鍵:rental_date 額外:使用其中;使用索引
爲什麼它以這種奇怪的方式工作?如前所示,即使在SELECT子句中包含與WHERE子句不同的列,第一個示例也使用索引排序。