首页 > 数据库 >反直觉SQL举例说明

反直觉SQL举例说明

时间:2024-09-01 21:03:17浏览次数:10  
标签:name 覆盖 age SQL 索引 student 直觉 explain 举例说明

版本MySQL5.7.34

有一个student表,字段如下

  • id

  • name

  • age

  • position

  • sex

建立联合索引(name, age, position)

问以下的SQL哪些会使用这个索引?

1、explain select * from student where name > 'AAA'

2、explain select * from student where age = 25

3、explain select name, age, sex from student where name like '%A' and age = 25

4、explain select name, age from student where name like '%A' and age = 25

5、explain select name from student where name like '%A'

解释:

第一句和第二句很基础,第一句可以,第二句不行,因为违背最左匹配原则

第三句也不行,因为是左模糊匹配,并且索引没有覆盖要查询的字段

那第四句呢?

第四句很明显是左模糊匹配,一般情况下我们会认为无法使用索引,但是实际上是可以的,原因如下

  • 首先这个索引覆盖了全部查询字段,在MySQL5.7以及之后的版本,优化器得到了较大的提升,会评估“全表扫描”以及“全索引扫描”的代价差距,一般情况下,如果索引能覆盖查询字段,会使用覆盖索引进行全索引扫描。

  • 为什么全索引扫描要性能更好?因为覆盖索引包含的字段是少于聚簇索引的,MySQL中一页的大小是固定的,覆盖索引加载相同数量的页可以加载更多的数据,从而减少IO次数,而我们知道MySQL的主要瓶颈其实就是磁盘IO。

  • 其次age使用了等值查询,所以可以在全索引扫描之后,查询到符合的记录,再使用age列进行索引使用,提高过滤age时的性能。

第五句SQL同理,全扫描覆盖索引代价是更低的,所以会使用覆盖索引。

如果例如第三句SQL,有一个字段在索引外部,无法使用覆盖索引,就算使用了,也还需要回表查询其它字段,MySQL就会直接全表扫描。

标签:name,覆盖,age,SQL,索引,student,直觉,explain,举例说明
From: https://www.cnblogs.com/lilizzyy/p/18391726

相关文章

  • 初始MYSQL数据库(1)——创建、删除数据库和数据表的相关操作
    找往期文章包括但不限于本期文章中不懂的知识点:个人主页:我要学编程(ಥ_ಥ)-CSDN博客所属专栏: MYSQL目录数据库的概念数据库的相关操作常用的数据类型 数值型 字符串类型日期类型数据表的相关操作练习数据库的概念数据库(Database)是按照数据结构来组织、存储......
  • MySQL:基础巩固-函数
    目录一、字符串函数二、数值函数三、日期函数四、流程函数一、字符串函数函数功能CONCAT(S1,S2,…,Sn)字符串拼接LOWER(str)转小写UPPER(str)转大写LPAD(str,n,pad)左填充,用字符串pad对str左边进行填充,达到n个字符串的长度RPAD(str,n,pad)右填充,用字符串pad对str右......
  • WPF access mysql and pass data from datagrid to mysql
    //sqldropdatabaseifexistsmydb;createdatabasemydb;usemydb;droptableifexistsmt;createtablemt(idintauto_incrementprimarykey,namevarchar(50)notnulldefault'',isbnvarchar(50)notnulldefault'',authorvarchar......
  • sqli-labs靶场(51-55)
    51关这关跟50关一样采用报错来查看Less-51/?sort=1andupdatexml(1,concat(1,(selectdatabase())),1)--+查表/Less-51/?sort=1'andupdatexml(1,concat(1,(selectgroup_concat(table_name)frominformation_schema.tableswheretable_schema='security')),1)--+查列......
  • python读取txt文本文件-批量更改mysql数据库中一批用户的用户名的python脚本保存及转
    一、python读取txt文本文件-批量更改mysql数据库中一批用户的用户名的python脚本保存    做一个简单的事:使用python读取一个txt文件,里面存储着N行用户id,需要一行行读取后再读取另一个存储用户昵称的txt文件,判断昵称是否有重复,如果没有重复就将数据库中的当前uid用户的昵称......
  • 基于Java+SpringBoot+Mysql在线众筹系统功能设计与实现一
    一、前言介绍:1.1项目摘要随着互联网的普及和人们消费观念的转变,众筹作为一种创新的融资方式,逐渐受到社会各界的关注和青睐。它打破了传统融资模式的限制,为初创企业、艺术家、公益项目等提供了更为灵活和便捷的融资渠道。因此,开发众筹系统旨在满足这一市场需求,促进创新项......
  • MySQL中日期和时间戳的转换:字符到DATE和TIMESTAMP的相互转换
    在MySQL中,经常需要在DATE、TIMESTAMP和字符串之间进行相互转换。以下是一些常见的转换方法:1.字符串到日期/时间类型字符串转DATE:使用STR_TO_DATE()函数将字符串转换为DATE类型。你需要提供字符串的格式。SELECTSTR_TO_DATE('2024-08-24','%Y-%m-%d')ASmy_......
  • mysqlbackup处理过程说明
    InnoDBdatafiles,redolog,binarylog,和relaylogfiles(除了正在使用的log文件)被拷贝到备份,这个期间数据库服务可以想平常一样使用innodb的表结构和数据可能在这个期间发生变化,所以下面的步骤就是确保这些变化被捕捉到备份中一个backuplock会被应用到服务器实例上,他会阻塞DD......
  • MySQL的索引原理及使用
    MySQL中的索引模型Mysql中的索引使用的数据结构一般为搜索树,这里的搜索树,一般使用B树,这里补一下数据结构中的B树结构;说B树之前,先顺一个前置的知识点,平衡二叉树;平衡二叉树二叉树应该都不陌生,大学数据结构的基本入门,二叉排序树是基于二叉树上多了个“有序”的概念,简单来说,即左<......
  • MySQL的索引原理及使用
    索引模型(基础数据结构)索引模型:哈希表、有序数组、搜索树,这里的模型是指索引的底层实现的基本数据结构,Mysql中不同的引擎对于索引的实现结构说的即是索引模型。 有序数组有序数组这个在数据结构中是最基础的结构,也是最简单的,对比理解的话就是我们编程中常用的数组、链表,它......