2017-07-14 82 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/了解更多信息。

相关问题