2017-07-14 107 views
1

我有以下表格:MySQL中where子句中的多列索引列的順序是否重要?

CREATE TABLE `student` ( 
    `name` varchar(30) NOT NULL DEFAULT '', 
    `city` varchar(30) NOT NULL DEFAULT '', 
    `age` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`name`,`city`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

我想知道,如果我執行以下兩條sql語句,他們有相同的性能?

mysql> select * from student where name='John' and city='NewYork'; 
mysql> select * from student where city='NewYork' and name='John'; 

棘手的的問題:

  1. 如果有一個多列索引(名稱,市),做兩個SQLS都在使用它?
  2. 由於索引,優化器是否將第二個sql更改爲第一個?

我執行對他們兩個解釋,結果如下:

mysql> explain select * from student where name='John' and city='NewYork'; 
+----+-------------+---------+-------+---------------+---------+---------+-------------+------+-------+ 

| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra | 
+----+-------------+---------+-------+---------------+---------+---------+-------------+------+-------+ 

| 1 | SIMPLE  | student | const | PRIMARY  | PRIMARY | 184  | const,const | 1 | NULL | 
+----+-------------+---------+-------+---------------+---------+---------+-------------+------+-------+ 

的mysql>解釋SELECT * FROM學生,在城市= '紐約' 和名稱= '約翰';

+----+-------------+---------+-------+---------------+---------+---------+-------------+------+-------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra | 
+----+-------------+---------+-------+---------------+---------+---------+-------------+------+-------+ 

| 1 | SIMPLE  | student | const | PRIMARY  | PRIMARY | 184  | const,const | 1 | NULL | 
+----+-------------+---------+-------+---------------+---------+---------+-------------+------+-------+ 
+2

多列索引中列的順序很重要。可以使用'name'和'city'列上的索引來代替'name'列上的索引,但不能使用列'city'上的索引。 WHERE條件中的條件順序無關緊要。 – axiac

+0

歡迎來到Stack Overflow。問你第一個問題你做得很好。 –

+0

索引食譜:http://mysql.rjweb.org/doc.php/index_cookbook_mysql –

回答

1

多列索引中列的順序很重要。

multiple-column indexes的文件上寫着:

MySQL能使用多列索引來測試索引中的所有列的查詢或查詢該測試只是第一列,前兩列中,前三列,依此類推。如果您在索引定義中以正確順序指定列,則單個組合索引可以加速同一個表上的多種查詢。

這意味着在列上namecity索引需要就name列的索引時,可以使用,但其不能用來代替一個索引對city柱。

WHERE條款中的條件順序無關緊要。關於WHERE子句上的條件的MySQL優化程序does a lot of work儘可能早地消除儘可能多的候選行並從表和索引中儘可能少地讀取數據(因爲一些讀取的數據因爲沒有被刪除匹配整個WHERE子句)。

1

如果,鑑於(name,city)索引,我執行以下兩條sql語句,他們有相同的性能?

where name='John' and city='NewYork'

where city='NewYork' and name='John'

是。

查詢計劃員不關心WHERE子句的順序。如果兩個子句都過濾均等,則規劃者可以使用索引。 SQL是聲明式語言,而不是程序。也就是說,你說你想要什麼,而不是如何得到它。對許多程序員來說這有點違反直覺。

它也可以使用(name,city)索引WHERE name LIKE 'Raymo%',因爲name是索引中的第一個。不過,它不能使用WHERE city = 'Kalamazoo'這個索引。

它可以使用WHERE city LIKE 'Kalam%' AND name = 'Raymond'的索引。在這種情況下,它使用索引來查找名稱值,然後掃描匹配的城市。

如果你有一個在(city,name)上的索引,你也可以使用WHERE city = 'Kalamazoo' AND name = 'Raymond'。如果兩個索引都存在,查詢計劃人員將選擇一個,可能基於某種基數考慮。

注意。如果您在cityname上有兩個不同的索引,則查詢計劃人員不能(至2017年年中)使用多個索引來滿足WHERE city = 'Kalamazoo' AND name = 'Raymond'

http://use-the-index-luke.com/瞭解更多信息。

相關問題