返回顶部
首页 > 资讯 > 数据库 >MySQL 使用索引扫描进行排序
  • 689
分享到

MySQL 使用索引扫描进行排序

MySQL索引扫描MySQL索引排序 2022-05-27 15:05:20 689人浏览 安东尼
摘要

目录安装sakila索引扫描排序表结构可以使用索引扫描来做排序的情况补足前导列order by 中只包含一种排序无法使用索引扫描的情况查询条件中包含不同排序方向查询条件中引用不在索引中的列无法组合最左前缀时第一列是查

目录
  • 安装sakila
  • 索引扫描排序
  • 表结构
  • 可以使用索引扫描来做排序的情况
    • 补足前导列
    • order by 中只包含一种排序
  • 无法使用索引扫描的情况
    • 查询条件中包含不同排序方向
    • 查询条件中引用不在索引中的列
    • 无法组合最左前缀时
    • 第一列是查询范围时
    • where中有多个等于条件
  • 总结

    安装sakila

    我们将会使用Mysql示例数据库sakila来进行sql的演示和讲解 dev.mysql.com/doc/sakila/…

    索引扫描排序

    MySQL有两种方式可以生成有序的结果:通过排序操作?或者按索引顺序扫描?如果EXPLaiN出来的type列的值为“index”,则说明MySQL使用了索引扫描来做排序。
    扫描索引本身是很快的,因为只需要从一条索引记录移动到紧接着的下一条记录。但如果索引不能覆盖查询所需的全部列,那就不得不每扫描一条索引记录就都回表查询一次对应的行。这基本上都是随机I/O,因此按索引顺序读取数据的速度通常要比顺序地全表扫描慢,尤其是在io密集型的工作负载时。此时可能就会用全表扫描而不是按索引查找了。
    如果可能,设计索引时应该尽可能地同时满足排序和查找行。
    只有当索引的列顺序和0RDER BY子句的顺序完全一致,并且所有列的排序方向(倒序或正序)都一样时,MySQL才能够使用索引来对结果做排序。如果查询需要关联多张表,则只有当ORDER BY子句引用的字段全部为第一个表时,才能使用索引做排序。ORDER BY子句和查找型查询的限制是一样的:需要满足索引的最左前缀的要求?否则,MySQL都需要执行排序操作(filesort),而无法利用索引排序。

    表结构

    我们将使用rental这个表来进行讲解

    
    CREATE TABLE `rental` (
      
      UNIQUE KEY `rental_date` (`rental_date`,`inventory_id`,`customer_id`),
      KEY `idx_fk_inventory_id` (`inventory_id`),
      KEY `idx_fk_customer_id` (`customer_id`),
      KEY `idx_fk_staff_id` (`staff_id`),
      
    ) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8mb4;
    

    查看Extra 中是否出现Using filesort(MySQL中无法利用索引完成的排序操作称为“文件排序”)当我们试图对一个没有索引的字段进行排序时,就是filesort。虽然里面有个file,但它跟文件没有任何关系,实际上是内部的一个快速排序

    可以使用索引扫描来做排序的情况

    补足前导列

    有一种情况下ORDER BY子句可以不满足索引的最左前缀的要求,就是前导列为常量的时候。如果WHERE子句或者JOIN子句中对这些列指定了常量,就可以“弥补”索引的不足。 我们使用Sakila数据库测试一下

    可以看到

    书上的Extra写的是Using where,而我执行的时候是Using index condition ,原因是高性能MySQL中使用的版本是5.5,5.6版本中的索引条件推送(index condition pushdown)还处于未正式发布阶段呢。这里没有filesort的原因是因为有个rental_date = '2005-05-25'的常量条件,相当于将索引的第一列补足了,这样就符合了索引的最左前缀要求。

    order by 中只包含一种排序

    
    SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date = '2005-05-25' ORDER BY  inventory_id desc
    

    可以看到

    需要注意这一条,在书中使用的的条件是rental_date>'2005-05-25'

    
    WHERE rental_date > '2005-05-25' ORDER BY rental_date, inventory_id
    

    此时无法使用索引排序而是直接全表扫描做了个排序,原因是因为返回数据的条数过多,用索引查询此时已经不划算了

    需要注意这里的解释里面的rows并不准确,只是一个估算值,实际上按这个条件查询有16036条数据 要想解决这个问题,就需要加上limit

    
    SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date > '2005-05-25' ORDER BY rental_date, inventory_id limit 0,10
    

    对应的执行计划

    可以看到使用了索引

    无法使用索引扫描的情况

    查询条件中包含不同排序方向

    
    SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date = '2005-05-25' ORDER BY  inventory_id desc,customer_id asc
    

    索引中两列都是正序,现在order by 中一列正序一列倒序就得二次排序了。

    查询条件中引用不在索引中的列

    
    SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date ='2005-08-23 21:01:09' ORDER BY  inventory_id ,staff_id
    

    无法组合最左前缀时

    
    SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date ='2005-08-23 21:01:09' ORDER BY  customer_id
    

    第一列是查询范围时

    
    SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date > '2005-08-22' ORDER BY  inventory_id,customer_id
    

    where中有多个等于条件

    
    SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date ='2005-08-23 21:01:09' and inventory_id in(1,2)  ORDER BY  customer_id
    

    简单来说就是不符合索引最左前缀的就会进行一次排序。

    总结

    今天我们讲解了MySQL中的索引扫描排序,明天我们还将继续介绍其他建立高性能索引的方法,敬请期待,下篇再见!

    以上就是MySQL 索引扫描的简单使用的详细内容,更多关于MySQL 索引扫描排序的资料请关注自学编程网其它相关文章!

    您可能感兴趣的文档:

    --结束END--

    本文标题: MySQL 使用索引扫描进行排序

    本文链接: https://lsjlt.com/news/10410.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • MySQL 使用索引扫描进行排序
      目录安装sakila索引扫描排序表结构可以使用索引扫描来做排序的情况补足前导列order by 中只包含一种排序无法使用索引扫描的情况查询条件中包含不同排序方向查询条件中引用不在索引中的列无法组合最左前缀时第一列是查...
      99+
      2022-05-27
      MySQL 索引扫描 MySQL 索引排序
    • 怎么进行mysql索引覆盖扫描优化
      本篇文章为大家展示了怎么进行mysql索引覆盖扫描优化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。覆盖扫描即直接在索引中扫描出结果返回给客户端,不需要根据索引再去...
      99+
      2024-04-02
    • MySQL松散索引扫描
      当使用distinct或group by的时候,如果字段在复合索引的前列且where条件也满足该复合索引,那么将使用松散索引,查询速度加快, 辨识方法,explian里的extra字段显示 Using index for grou...
      99+
      2018-05-09
      MySQL松散索引扫描
    • Mysql如何使用索引排序
      在mysql中使用索引排序的方法首先,在命令行中启动MySQL服务;service mysql start  MySQL服务启动后,在命令行中输入mysql的用户名和密码登录到MySQL;mysql -u root -p登录到MySQL后,...
      99+
      2024-04-02
    • MySQL 索引排序
      开发过程中发现SQL一直filesort,所以研究一下到低怎么才能使用索引进行排序。 表结构和数据 CREATE TABLE `t1` ( `id` int(11) NOT NULL AU...
      99+
      2016-11-18
      MySQL 索引排序
    • 使用awvs进行web安全扫描
      1、安装 docker pull secfa/docker-awvsdocker run -it -d -name awvs -p 13443:3443 --cap-add LINUX_IMMUTABLE secfa/docker-awvs...
      99+
      2023-08-30
      web安全 安全
    • MySQL中的全表扫描和索引树扫描 的实例详解
      目录引言实例引言 在学习mysql时,我们经常会使用explain来查看sql查询的索引等优化手段的使用情况。在使用explain时,我们可以观察到,explain的输出有一个很关键...
      99+
      2024-04-02
    • MySQL 8.0 之索引跳跃扫描(Index Skip Scan)
      前言 MySQL 8.0.13开始支持 index skip scan 也即索引跳跃扫描。该优化方式支持那些SQL在不符合组合索引最左前缀的原则的情况,优化器依然能组使用组合索引。 talk is cheap ,sh...
      99+
      2022-05-29
      MySQL 8.0 索引跳跃扫描 MySQL 8.0 Index Skip Scan
    • 关于在 MySQL 排序中使用索引这件事!
      文章目录 1. 排序的两种方式2. 索引排序2.1 案例一2.2 案例二2.3 案例三2.4 案例四2.5 案例五2.6 案例六2.7 案例七2.8 案例八 3. 其他情况3.1 多表联...
      99+
      2023-08-31
      mysql 数据库 sql
    • PHP对数组进行排序并保持索引关系
      这篇文章将为大家详细讲解有关PHP对数组进行排序并保持索引关系,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 PHP对数组进行排序并保持索引关系 在PHP中,可以使用多种方法对数组进行排序,同时保持索引...
      99+
      2024-04-02
    • 使用索引来排序查询结果
      使用索引来排序查询结果在MongoDB中,排序操作可以通过从索引中按照索引顺序获取文档的方式来保证结果的有序性。如果查询计划器(planner)无法从索引中得到排序顺序,那么它将需要在内存中排序结果。相比于...
      99+
      2024-04-02
    • VHDL std_logic_vector使用“downto”进行索引
      在VHDL中,std_logic_vector类型可以使用"downto"关键字进行索引。通过"downto"关键字,您可以指定索引...
      99+
      2023-09-26
      VHDL
    • mysql8.0怎么进行降序索引
      本篇内容介绍了“mysql8.0怎么进行降序索引”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MySQL支...
      99+
      2024-04-02
    • PHP对数组进行逆向排序并保持索引关系
      这篇文章将为大家详细讲解有关PHP对数组进行逆向排序并保持索引关系,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用 krsort() 函数 krsort() 函数可以将数组中的键值对按照键名逆向排序,同...
      99+
      2024-04-02
    • PHP如何对数组进行排序并保持索引关系
      这篇文章将为大家详细讲解有关PHP如何对数组进行排序并保持索引关系,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 数组排序并保持索引关系 引言 在 PHP 中,数组是用于存储和管理数据的动态数据结构...
      99+
      2024-04-02
    • Swoole和Workerman对PHP与MySQL的索引扫描和索引覆盖查询的优化方法
      引言:在大规模的Web应用中,数据库查询的性能优化是至关重要的。索引是一种非常有效的优化手段之一,可以加快查询的速度。针对PHP与MySQL的索引扫描和索引覆盖查询,本文将介绍如何使用Swoole和Workerman来进行优化,并提供具体的...
      99+
      2023-10-21
      优化方法 Workerman 关键词:swoole
    • SQL如何利用索引排序
      这篇文章主要为大家展示了“SQL如何利用索引排序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL如何利用索引排序”这篇文章吧。近期在做数据库的慢SQL优化,...
      99+
      2024-04-02
    • mysql如何进行索引修改
      这篇文章主要介绍“mysql如何进行索引修改”,在日常操作中,相信很多人在mysql如何进行索引修改问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql如何进行索引修改”...
      99+
      2024-04-02
    • MySQL索引如何进行优化
      这篇文章主要介绍了MySQL索引如何进行优化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  创建 test 测试表  CREATE TAB...
      99+
      2024-04-02
    • Java使用LinkedHashMap进行分数排序
      分数排序的特殊问题在java中实现排序远比C/C++简单,我们只要让集合中元素对应的类实现Comparable接口,然后调用Collections.sort();方法即可.这种方法对于排序存在许多相同元素的情况有些浪费,明显即使值相等,两个...
      99+
      2023-05-31
      java linkedhashmap 排序
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作