美文网首页mysql大杂烩
以下两个sql是如何使用索引的?

以下两个sql是如何使用索引的?

作者: qishuai | 来源:发表于2021-08-09 09:31 被阅读0次
mysql> show create table s1;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| s1    | CREATE TABLE `s1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `key1` varchar(100) DEFAULT NULL,
  `key2` int(11) DEFAULT NULL,
  `key3` varchar(100) DEFAULT NULL,
  `key_part1` varchar(100) DEFAULT NULL,
  `key_part2` varchar(100) DEFAULT NULL,
  `key_part3` varchar(100) DEFAULT NULL,
  `common_field` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_key2` (`key2`),
  KEY `idx_key1` (`key1`),
  KEY `idx_key3` (`key3`),
  KEY `idx_key_part` (`key_part1`,`key_part2`,`key_part3`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
mysql> explain select key_part1 from s1 where key_part1 = "a" and key_part2 > "b" AND key_part3 > "c";
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+--------------------------+
| id | select_type | table | partitions | type  | possible_keys | key          | key_len | ref  | rows | filtered | Extra                    |
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+--------------------------+
|  1 | SIMPLE      | s1    | NULL       | range | idx_key_part  | idx_key_part | 606     | NULL |    1 |    33.33 | Using where; Using index |
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)

该explain结果中,key字段信息表明该查询使用到了索引: idx_key_part;Extra信息里面包含了Using whereUsing index,其中Using where代表该查询需要mysql server层进行判断,Using index代表该查询使用到了覆盖索引的特性,不需要回表操作。
所以该sql的执行流程是,mysql存储引擎层将满足key_part1 = "a"条件的第一条记录返回给mysql server层,由于该索引是联合索引(包含key_part1,key_part2,key_part3这三个字段),所以除了key_part1字段外,其他字段也一起会返回给server层,然后server层判断该记录是否符合查询条件,如果符合发送给客户端,否者不发送;然后server层继续向存储层要下一条记录,继续判断,直到第一条不满足key_part1 = "a"条件的记录为止,然后存储层告诉server层,查询完毕。

mysql> explain select * from s1 where key_part1 = "a" and key_part2 > "b" AND key_part3 > "c";
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type  | possible_keys | key          | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | s1    | NULL       | range | idx_key_part  | idx_key_part | 606     | NULL |    1 |    33.33 | Using index condition |
+----+-------------+-------+------------+-------+---------------+--------------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec)

explain结果中,key字段信息表明该查询使用到了索引: idx_key_part;Extra信息为Using index condition说明该sql使用了innodb引擎的Index Condition PushDown的能力,即索引下推;
执行流程如下:mysql存储引擎层将满足key_part1 = "a"条件的第一条记录,继续判断该记录是否满足key_part2 > "b" AND key_part3 > "c"条件,如果满足返回给server层,否者不返回;直到第一条不满足key_part1 = "a"条件的记录为止,查询完毕。

相关文章

  • 以下两个sql是如何使用索引的?

  • 1. Mysql索引数据结构详解

    一. 索引优化面试题分析 1.1 分析以下几条sql的索引使用情况 二. 索引到底是什么 索引是帮助MySQL高效...

  • 咱们500万条数据测试一下,如何合理使用索引加速?

    5 如何合理使用索引加速 tips:500万条建表sql参照网盘sql脚本 索引是数据库优化最常用也是最重要的手段...

  • SQL语句的优化

    sql语句的优化:多使用共享语句 尽量使你的sql语句能够使用索引。怎样使sql语句能够使用到索引呢:当sql语句...

  • mysql优化案例

    SQL优化功能可以为您的慢SQL提供索引建议、检测因隐式转换,函数等表达式不能使用索引的情况。请大家参考以下几个例...

  • 索引失效

    在编写sql语句时,一般都会用到索引来提升sql性能,但是有些sql语句使用索引是不生效的。 is null 和...

  • Mysql慢查询如何优化 --- 2021-09-14

    检查是否走了索引,如果没有则优化sql,使用索引; 检查所使用的的索引,是否是最有索引; 检查所查字段是否都是必须...

  • MySQL优化----SQL语句和索引优化

    sql及索引优化 如何发现有问题的sql? 使用Mysql的慢查询日志对有效率问题的SQL进行监控 慢查询日志所包...

  • mysql查询语句优化

    一、通过使用explain来分析sql查询性能 explain显示了mysql如何使用索引来处理select语句以...

  • Mysql 索引优化

    联合索引和单个索引选择 对比,值越大越好 强制使用某个索引 使用explain分析索引 1、id:SQL执行的顺序...

网友评论

    本文标题:以下两个sql是如何使用索引的?

    本文链接:https://www.haomeiwen.com/subject/pftzvltx.html