我已經閱讀了幾個關於此問題的其他堆棧溢出問題,但它仍然沒有意義。MySQL沒有使用索引來排序
我與sakila的世界測試數據庫進行試驗,這是我的表定義:
CREATE TABLE `City` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`CountryCode` char(3) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `CountryCode` (`CountryCode`),
KEY `city_name` (`Name`),
CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `Country` (`Code`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1
這裏是我的指標:
mysql> show index from City;
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| City | 0 | PRIMARY | 1 | ID | A | 4188 | NULL | NULL | | BTREE | | |
| City | 1 | CountryCode | 1 | CountryCode | A | 465 | NULL | NULL | | BTREE | | |
| City | 1 | city_name | 1 | Name | A | 4188 | NULL | NULL | | BTREE | | |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
我試圖理解爲什麼MySQL是不使用這裏對結果進行排序的索引:
mysql> explain select * from City order by Name asc;
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE | City | ALL | NULL | NULL | NULL | NULL | 4188 | Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
我不明白爲什麼MySQL在這個文件夾中做文件情況下,很明顯城市名稱上的索引已經排序。
我看了一些其他的問題,人們在他們的索引中使用前綴,這是禁止MySQL使用該索引進行排序。當我在名稱上創建該索引時,我沒有使用前綴。
其他人也期待在Extra列中看到「使用索引」。我的理解是,這意味着索引'覆蓋'了查詢,這意味着實際的表不需要被讀取,因爲索引具有所有的值。所以我不希望在額外列中看到這一點,因爲索引僅在名稱上,還有其他列。
我覺得這個術語「使用索引」有點讓人誤解,MySQL可以使用索引來過濾結果,但仍然需要讀取表格。在這種情況下,「使用索引」不會成爲Extra列的一部分。太誤導了。
有人請向我解釋爲什麼MySQL仍然在使用該查詢的文件?如果你想知道的話,有4079行。
另外,是否有任何明確的方法知道MySQL使用索引來排序結果?
優化器看到您將讀取表中的所有記錄,因此它傾向於從PRIMARY索引讀取而不是從輔助city_name讀取。因此MySQL必須做額外的排序。 – akuzminsky