gpt4 book ai didi

mysql - MySQL where 子句中多列索引的列顺序是否重要?

转载 作者:可可西里 更新时间:2023-11-01 08:09:35 27 4
gpt4 key购买 nike

我有一个表格如下:

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. 如果有一个多列索引(name,city),两个SQL都用吗?
  2. 优化器是否因为索引而将第二个 sql 更改为第一个?

我对他们两个执行explain,结果如下:

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 student where city='NewYork' and name='John';

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

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

最佳答案

If, given an index on (name,city), I execute the following two SQLs, do they have the same performance?

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

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

是的。

查询规划器不关心WHERE 子句的顺序。如果您的两个子句都按相等性进行过滤,则计划者可以使用索引。 SQL 是一种声明性语言,而不是过程性语言。也就是说,您说的是您想要的,而不是如何获得它。 em> 对于许多程序员来说,这有点违反直觉。

它也可以使用 (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/获取有用信息。

关于mysql - MySQL where 子句中多列索引的列顺序是否重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45100174/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com