内容摘录来源:MSSQL123 ,lujun9972.github.io/blog/2018/03/13/如何编写bash-completion-script/

一、先公布下结论:

1、如果分页排序字段是聚集索引,完全没必要对索引分页再查询数据,因为索引就是数据本身;

2、如果是非聚集索引,先对索引分页,然后再利用索引去查询数据,先分页索引确实可以减少扫描的范围;

3、如果经常按照2中的方式查询,也就是按照非聚集索引排序查询,强烈建议直接在该列上建立聚集索引;

二、MySQL经典的分页“优化”做法:

1、若在id上建立聚集索引,随着m的增大,查询同样多的数据,会越来越慢;

分页查询sql语句:select * from t order by id limit m,n ;

优化后的查询语句: select * from t inner join (select id from t order by id limit m,n)t1 on t1.id = t.id;

查询结果证明,优化后的没有卵用;

分析原因:排序列为聚集索引列的情况下,两者都是按照索引顺序扫描表,来查询符合条件的数据;后者虽然是先驱动一个子查询,然后再用子查询的结果驱动主表,但是子查询并没有改变“顺序扫描表,来查询符合条件的数据的”做法,当前情况下,甚至改写后的做法显得画蛇添足。

解决办法:mysql中也有类似于sqlserver中的正向(forwarded)和反向扫描(backward)的做法。如果对于靠后的数据,采用反向扫描,应该就可以很快找到这个部分数据,然后对找到的数据在再次排序(asc),查询结果是一样的(其实是借鉴了B-tree索引的数据结构)。

查询sql语句:select * from ( select * from test_table1 order by id desc limit 99980,20 ) t order by id;

实时证明,牛车直接变火箭了!换个角度考虑,当我们查字典时,若要查“张”字,肯定是直接翻到“Z”开头的去查,肯定不是从字母“A”开始翻吧。数据库也是人设计的,他们的解决方案,通常都是用现实生活中,小学生都能想明白的方案。

2、我们来了解下B-tree索引的数据结构,作者的这俩张图,灰常流弊:

如下图,当查询的数据“靠后”的时候,实际上是偏离在B树索引的一个方向,如下两个截图所示的目标数据其实平衡树上的数据,没有所谓的“靠前”与“靠后”,“靠前”与“靠后”都是相对于对方来说的,或者说是从扫描的方向上来看的从一个方向上看“靠后的”数据,从一个方向看就是“靠前的”,前后不是绝对的。

上面的分页优化方案就是根据这俩张图得出来的;

3、当我们以非聚集索引列作为排序字段时:

优化前sql语句:select * from test_table1 order by id_2 asc limit 4900000,20;执行时间为1分钟多一点,暂且认其为60秒;

优化后sql语句:select t1.* from test_table1 t1 inner join (select id from test_table1 order by id_2 limit 4900000,20)t2 on t1.id = t2.id;执行时间1.67秒,查询速度提高了40倍;

分析原因:可以简单理解为优化前的sql执行时做全表扫描之后,然后重新按照id_2排序,最后取最前20条数据;全表扫描就是一个非常耗时的过程,排序也是一个非常大的代价,因此表现为性能非常的低下。优化后的sql 语句的执行计划,是首先在子查询中,按照id_2上的索引顺序扫描,然后用符合条件的主键Id去表中查询数据。这样的话,避免了查询出来大量的数据然后重新排序(Using filesort)。

结论:排序列为非聚集索引列的时候,改写后的sql才能提升分页查询的效率。

使用聚集索引和非聚集索引对MySQL分页查询的优化的更多相关文章

  1. SQLSERVER聚集索引与非聚集索引的再次研究(上)

    SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...

  2. SQLSERVER聚集索引与非聚集索引的再次研究(下)

    SQLSERVER聚集索引与非聚集索引的再次研究(下) 上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 ...

  3. SQL Server-聚焦聚集索引对非聚集索引的影响(四)

    前言 在学习SQL 2012基础教程过程中会时不时穿插其他内容来进行讲解,相信看过SQL Server 2012 T-SQL基础教程的童鞋知道前面写的所有内容并非都是摘抄书上内容,如若是这样那将没有任 ...

  4. SQL SERVER 索引之聚集索引和非聚集索引的描述

    索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度. 索引包含由表或视图中的一列或多列生成的键. 这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关 ...

  5. SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引

    我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我 ...

  6. SQL Server索引 (原理、存储)聚集索引、非聚集索引、堆 <第一篇>

    一.存储结构 在SQL Server中,有许多不同的可用排列规则选项. 二进制:按字符的数字表示形式排序(ASCII码中,用数字32表示空格,用68表示字母"D").因为所有内容都 ...

  7. SQL Server索引 - 聚集索引、非聚集索引、非聚集唯一索引 <第八篇>

    聚集索引.非聚集索引.非聚集唯一索引 我们都知道建立适当的索引能够提高查询速度,优化查询.先说明一下,无论是聚集索引还是非聚集索引都是B树结构. 聚集索引默认与主键相匹配,在设置主键时,SQL Ser ...

  8. 聚集索引VS非聚集索引

    聚集索引VS非聚集索引 SQL Server 2014 发布日期: 2016年12月 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度. 索引包含由表或视图中的一列或多列生成的键. ...

  9. MySQL聚集索引和非聚集索引

    索引分为聚集索引和非聚集索引,mysql中不同的存储引擎对索引的底层实现可能会不同,这里只关注mysql的默认存储引擎InnoDB. 利用下面的命令可以查看默认的存储引擎 show variables ...

随机推荐

  1. Linux与Windows的设备驱动模型对比

    Linux与Windows的设备驱动模型对比 名词缩写: API 应用程序接口(Application Program Interface ) ABI 应用系统二进制接口(Application Bi ...

  2. Idea+Maven部署打包JavaFX项目遇到的坑

    用Idea写了一个JavaFX项目,创建artifacts,build artifacts,运行build出来的exe可执行文件时总是遇到 class not found的错误,如下图 一开始根据提示 ...

  3. css 对div用hover设置border,出现抖动和div走位问题,解决方法

    样式设置 : div:hover { border:1px solid red;} 当鼠标移动到div时,产生抖动和偏移. 产生的原因: 是因为设置border时设置了1px边框,多出的这1px,与其 ...

  4. windows批处理来执行java程序

    新建后缀名为.bat的文件,然后用记事本编辑,如果用sublime高级记事本编辑最好. @echo off % mshta vbscript:CreateObject()(window.close)& ...

  5. STM32启动BOOT0 BOOT1设置方法

    原理图 启动方式 第一种启动方式是最常用的用户FLASH启动.默认启动方式 第二种启动方式是STM32内嵌的SRAM启动.该模式用于调试 第三种启动方式是系统存储器启动方式,不建议使用这种,速度比较慢 ...

  6. ESP8266 AT指令

    无线网络名称 ESP_XXXXXX,后面的数字是MAC地址后几位 应用模式: AT+CWMODE? //查询 AT+CWMODE=<mode> //设置(重启后生效).1-Station模 ...

  7. instanceof解析

    https://www.zhihu.com/question/21574535/answer/18998914 Java instanceof 关键字是如何实现的? 基本理解 只是在同一个类加载器加载 ...

  8. 利用python3 爬取 网易云 上 周杰伦所有专辑,歌曲,评论,并完成可视化分析已经歌曲情绪化分析

    这篇文章适合于python爱好者,里面可能很多语句是冗长的,甚至可能有一些尚未发现的BUG,这个伴随着我们继续学习来慢慢消解吧.接下来 我把里面会用到的东西在这里做一个简单总结吧:本文用到了两门解释性 ...

  9. 、M/C/U/简单加/密方法、

    ............................... 一.STM32Flash组织 STM32的Flash包括主存储器(HD版本,512KB)+信息块.信息块包括2KB的系统存储器(用于系统 ...

  10. Caffe---Pycaffe转换均值文件:xxx_mean.binaryproto成为xxx_mean.npy

    Pycaffe转换均值文件:xxx_mean.binaryproto成为xxx_mean.npy 为什么需要mean.binaryproto转mean.npy? 使用Caffe的C++接口进行操作时, ...