sql是否使用多个列索引?(MySQL)

sql是否使用多个列索引?(MySQL),mysql,indexing,Mysql,Indexing,第一个sql必须使用索引,但是第二个sql是否使用索引?为什么呢?如果优化器“感觉”喜欢,两者都可以使用索引。不管出于什么原因,它可能选择不这样做,但是和操作数的顺序不应该是这样的原因——事实上,如果是这样的话,我认为这是一个bug 由于和通勤,因此在和操作中,如果姓氏上的条件是第一个或第二个,则没有区别(对于姓氏) 你可以自己试试。只是比较一下计划。很可能它们是相同的 请记住,SQL是一种描述性语言。你不告诉系统该做什么,而是告诉系统你想要什么。它会自己弄清楚它是如何做到的,以及它是如何以一种

第一个sql必须使用索引,但是第二个sql是否使用索引?为什么呢?

如果优化器“感觉”喜欢,两者都可以使用索引。不管出于什么原因,它可能选择不这样做,但是
操作数的顺序不应该是这样的原因——事实上,如果是这样的话,我认为这是一个bug

由于
通勤,因此在
操作中,如果
姓氏
上的条件是第一个或第二个,则没有区别(对于
姓氏

你可以自己试试。只是比较一下计划。很可能它们是相同的


请记住,SQL是一种描述性语言。你不告诉系统该做什么,而是告诉系统你想要什么。它会自己弄清楚它是如何做到的,以及它是如何以一种快速的方式做到的。因此,它可以自由地重新处理查询,尤其是在可能的情况下更改操作数顺序这样的琐事。

认为条件总是从左到右求值是错误的。.一个次要问题:使用
VARCHAR
,而不是
CHAR
(除非所有名称的长度都精确到30个字符)。但是,如果只测试
姓氏
其中姓氏='sticky'
,而不测试
姓氏
,则该索引将无效。也就是说,
的顺序无关紧要,但
索引中的顺序无关紧要。更多:
CREATE TABLE test (
    id         INT NOT NULL,
    last_name  CHAR(30) NOT NULL,
    first_name CHAR(30) NOT NULL,
    PRIMARY KEY (id),
    INDEX name (last_name,first_name)
);

1. SELECT * FROM test WHERE last_name='bob' and first_name='John';

2. SELECT * FROM test WHERE first_name='John' and last_name='bob';