• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > Mysql-聚簇索排序慢案例分析

Mysql-聚簇索排序慢案例分析

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了Mysql,聚簇索排序,案例分析等相关知识,希望本文的分享对您有所帮助
为什么当 执行select较多时应当使用mysiam引擎呢?尤其是在有索引的情况下

本篇章依托一个实际应用,分析一下。


一.前言:

网上看到有一个有趣的现象,一个有1W数据量的表,执行不同的orderby条件,查询时间非常大,这个是实际应用中确实出现的问题??为什么呢?

537.png

二.分析

a).情况描述:

1.有主键id,联合索引(id,ver);用前者当orderby查询慢,用后者orderby查询会很快;

2.每一行的数据量挺大

3.id为主索引,而select查询的字段也仅仅有id,那么不就是索引覆盖了呗,不用到物理磁盘回行数据,在索引上就能拿到要的数据了,但本应该查询更快的却慢了。Mysql-索引覆盖

b).分析:

肯定用的不是mysiam引擎,若是的话用这两个索引查询,其实速度是差不多的,因为索引上存的都是一个物理行的地址嘛,实际占有的数据量又不大。但如果是innodb就不一样了,它的主索引下边可是拖家带口存放着该行的所有数据的。

c).结论:

1.主因:用的innodb引擎

是聚簇索引,主键ID索引还下拖家带口的挂着该行的其他数据,导致沿着ID排序时,要跨过好多小块才能查询遍历每个ID;(而mysiam下头没那么多数据,跨过相同的数据块会更快,遍历更多的行)

2.从因:有几个字段下的数据量比较大,即拖家带口带的人还比较多,数据量比较大。每行数据量大,在磁盘存储时占用的块儿也多

3. 当时mysiam引擎时不存在这个问题

d).映射结论:

当 执行select较多时,应当使用mysiam引擎,

当执行 insert,update多时使用innodb引擎

更多结论请看:Mysql-索引总结

三.模拟测试

还原上面所说的条件,建立连个表,控制变量,除了引擎不同外,其余条件相同,主键ID主索引,联合索引(id,ver)。

1.新建表t7,mysiam引擎

538.png

2.随机插入一万条数据


539.png

3.执行查询语句,查看时间


540.png

显然,时间相差不太大,都是一个量级的。

4.新建表t8,innodb引擎

541.png

5.随机插入一万条数据

542.png

小插曲,按照上边脚本执行语句,等待时间非常长,为什么呢?因为其为聚簇索引,有主键索引ID,在创建主键索引的时候,行的数据块大量移动,有分裂移动的时间在里边。

操作是先删除主键索引ID,插入数据后在add primary key(id),再创建主键索引结构

543.png

6.执行查询语句,查看时间

显然,时间相差差别很大。

原因:两个语句都用到了聚簇索引,只是主键的跨块儿太多,而联合索引为次级索引,下边无数据,块儿少,遍历快。

544.png

7.总分析,只有t8表(innodb)的按照主键索引排序耗时多,其余还好

时间排序结论:innodb.主索引 > innodb.次索引 > mysiam

效率将近差了27倍,问题处在了哪里?

1.主因,沿着主键做order by排序,查询时会跨页很多块,时间增加

2.如果没有几个长的char字段,数据块也不大,也就不会造成这么大的差别,

比如,删除表中str1,str2,str3字段,查询时间也会大大减少,差异不明显


以上就是Mysql-聚簇索排序慢案例分析的内容,更多相关内容请关注微课江湖()!

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 分享下mysql各个主要版本之间的差异
  • MySQL essential版本和普通版本有什么区别?
  • redhat 5.4下安装MYSQL全过程
  • 如何用SQL命令查看Mysql数据库大小
  • 解析mysql中如何获得数据库的大小
  • 解析mysql修改为utf8后仍然有乱码的问题
  • 5个常用的MySQL数据库管理工具详细介绍
  • 解析在MySQL里创建外键时ERROR 1005的解决办法
  • 解析远程连接管理其他机器上的MYSQL数据库
  • mysql 精简过程(删除一些文件)

相关文章

  • 2018-12-05mysql连接数据库并测试实例分享
  • 2017-05-11详解远程连接Mysql数据库的问题(ERROR 2003 (HY000))
  • 2018-12-05Windows中如何修改MySQL数据路径datadir?
  • 2018-12-05详解mysql数据库中文乱码问题
  • 2018-12-05MySQL 视图 第1349号错误解决方法
  • 2018-12-05MySQL的limit用法和分页查询语句的性能分析详解
  • 2018-12-05SQL语句技巧:按月统计数据
  • 2017-05-11javascript身份证验证代码
  • 2017-05-11在MySQL中使用LIMIT进行分页的方法
  • 2018-12-05SQL Server 2012 错误处理增强THROW

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • MySQL使用两种方法解决远程连接失败的问题
    • 使用MySQL数据库(4)创建数据库表
    • 标准MySQL数据库外的5个开源兼容方案
    • 分享关于MySQ函数的实例介绍
    • SQLServer 参数化查询经验分享
    • 让数据库变快的建议
    • 优化-mysql把符合条件的字段相加,
    • mysql 数据库设计
    • mysql 控制台程序的提示符 prompt 字符串设置
    • mysql 开启慢查询 如何打开mysql的慢查询日志记录

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有