如果我在第4栏上有索引:
CREATE TABLE mytable (
from varchar(20) NOT NULL,
to varchar(20) NOT NULL,
departure date NOT NULL,
arrival date NOT NULL,
....
KEY mykey(from, to, departure, arrival)
);当我只对from和to进行均匀度查询时,是否需要创建一个额外的索引KEY fromto (from, to),以便mysql使用索引进行扫描?
或者mysql会重用现有的索引,因为我只是使用SELECT * from mytable where from = 'New' and to = 'York'查询其中的一个子集?甚至只有一个关于...from = 'New'的查询
发布于 2020-05-04 10:13:11
Mysql 文档说;
如果表有多列索引,则由优化器
any leftmost prefix of the index can be used查找行.例如,如果您有一个三列索引on (col1,col2,col3),那么您已经在(col1)、(col1、col2)和(col1、col2、col3)上建立了索引搜索功能。
您可以使用explain查看是否使用索引。
mysql> explain select * from mytable where `from` = 'a' and `to` = 'b';
+----+-------------+---------+------------+------+---------------+-------+---------+-------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+-------+---------+-------------+------+----------+-------------+
| 1 | SIMPLE | mytable | NULL | ref | mykey | mykey | 164 | const,const | 1 | 100.00 | Using index |
+----+-------------+---------+------------+------+---------------+-------+---------+-------------+------+----------+-------------+
1 row in set, 1 warning (0.02 sec)发布于 2020-05-04 10:08:08
不,你不需要额外的索引。只要可以使用索引的前缀部分,就可以使用索引。
如果您有一个索引on (从、到、离开、到达),则可以将该索引用于任何在以下方面具有相等匹配的查询:
(自)
(从,到)
(从、到、离)
(往返、离开、抵达)
按任何顺序。
https://stackoverflow.com/questions/61589358
复制相似问题