MySQL 命中多个索引会走哪个?

1. 概述

在MySQL中,当一个查询条件可以命中多个索引时,MySQL会根据索引的选择性、查询成本等因素,选择其中一个索引来执行查询。本文将介绍MySQL执行多个索引命中时的选择过程,并给出实际案例进行演示。

2. 流程图

graph TD
A[查询条件]
A --> B(选择最佳索引)
B --> C(执行查询)

3. 具体步骤

步骤 动作 代码 注释
1 理解查询条件 - 需要明确了解需要查询的条件,例如 WHERE id = 1 AND name = 'John' 中的idname字段
2 收集索引信息 EXPLAIN SELECT * FROM table_name WHERE id = 1 AND name = 'John' 使用EXPLAIN命令获取查询计划,包括使用的索引信息
3 判断命中索引数 SHOW WARNINGS 通过查看SHOW WARNINGS,可以得知实际命中的索引数
4 确定最佳索引 - 根据索引选择性、查询成本等因素,选择其中一个索引作为最佳索引
5 执行查询 SELECT * FROM table_name WHERE id = 1 AND name = 'John' 执行查询操作

4. 代码示例

首先,我们创建一个示例表用于演示:

CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  age INT
);

CREATE INDEX idx_id ON users (id);
CREATE INDEX idx_name ON users (name);

接下来,我们使用EXPLAIN命令获取查询计划:

EXPLAIN SELECT * FROM users WHERE id = 1 AND name = 'John';

执行以上命令后,得到以下查询计划:

id | select_type | table | partitions | type | possible_keys | key | key_len | ref  | rows | filtered | Extra
-------------------------------------------------------------------------------------------------------------------
1  | SIMPLE      | users |            | ref  | idx_id,idx_name | idx_id | 4       | const | 1    | 100.00   | Using where

可以看到,查询计划中的possible_keys列列出了可能使用的索引,而key列则表示实际使用的索引。在这个例子中,可选择idx_ididx_name这两个索引。

接着,我们查看实际命中的索引数:

SHOW WARNINGS;

执行以上命令后,可以看到如下信息:

Level | Code | Message
------------------------------------------------
Note  | 1003 | /* select#1 */ select `users`.`id` AS `id`,`users`.`name` AS `name`,`users`.`age` AS `age` from `users` where ((`users`.`id` = 1) and (`users`.`name` = 'John')) /* index_merge(idx_id,idx_name) */

可以看到,实际命中了两个索引,即idx_ididx_name

根据索引选择性、查询成本等因素,选择其中一个索引作为最佳索引。在这个例子中,我们选择了idx_id作为最佳索引。

最后,我们执行查询操作:

SELECT * FROM users WHERE id = 1 AND name = 'John';

执行以上命令后,即可得到查询结果。

5. 类图

classDiagram
    class Query {
      +execute()
    }
    class Index {
      +chooseBestIndex()
    }
    class Execution {
      +performQuery()
    }

    Query --> Index
    Execution --> Query

6. 结果饼状图

pie
    title 结果
    "命中索引" : 2
    "未命中索引" : 1

7. 总结

当MySQL中的查询条件可以命中多个索引时,MySQL会根据索引的选择性、查询成本等因素选择其中一个索引来执行查询。通过使用EXPLAIN命令和SHOW WARNINGS命令可以查看查询计划和实际命中的索引数。最终根据选择性、成本等因素