mysql innode和myisam引擎查询性能比较测试

百度了一遍下来都在说myisam引擎的查询性能比innodb好,但是没有看到拿数据出来说话的,今天得空就做了下测试。

知识回顾

摘抄自:https://blog.csdn.net/STFPHP/article/details/52827845?utm_source=blogkpcl13

MyISAM索引的实现
MyISAM索引文件和数据文件是分离的,索引文件仅保存记录所在页的指针(物理位置),通过这些地址来读取页,进而读取被索引的行。下图是MyISAM的索引原理图:(为了简化,一个页内只存放了两条记录。)

上图所提供的示例表字段有Col1(ID)、Col2(age)、Col3(name)三个,其中Col1为Primary Key(主键),上图很好地说明了树中叶子保存的是对应行的物理位置。通过该值,存储引擎能顺利地进行回表查询,得到一行完整记录。同时,每个叶子页也保存了指向下一个叶子页的指针。从而方便叶子节点的范围遍历。
而对于二级索引,在 MyISAM存储引擎中以与上图同样的方式实现,这也说明了 MyISAM的索引方式是“非聚集的”,与 Innodb的“聚集索引”形成了对比。
InnoDB索引的实现
聚集索引
与 MyISAM相同的一点是,InnoDB 也采用 B Tree这种数据结构来实现 B-Tree索引。而很大的区别在于,InnoDB 存储引擎采用“聚集索引”的数据存储方式实现B-Tree索引,所谓“聚集”,就是指数据行和相邻的键值紧凑地存储在一起,注意 InnoDB 只能聚集一个叶子页(16K)的记录(即聚集索引满足一定的范围的记录),因此包含相邻键值的记录可能会相距甚远。

在 InnoDB 中,表被称为 索引组织表(index organized table),InnoDB 按照主键构造一颗 B Tree (如果没有主键,则会选择一个唯一的并且非空索引替代,如果没有这样的索引,InnoDB则会隐式地定义一个主键来作为聚集索引),同时叶子页中存放整张表的行记录数据,也可以将聚集索引的叶子节点称为数据页,非叶子页可以看做是叶子页的稀疏索引。

下图说明了 InnoDB聚集索引的实现方式,同时也体现了一张 innoDB表的结构,可以看到,InnoDB 中,主键索引和数据是一体的,没有分开。:

这种实现方式,给予了 InnoDB 按主键检索的超高性能。可以有目的性地选择聚集索引,比如一个邮件表,可以选择用户ID来聚集数据,这样只需要从磁盘读取较少并且连续的数据页就能获得某个id的用户全部的邮件,避免了读取分散页时所耗费的随机I/O。

辅助索引
而对于辅助索引,InnoDB采用的方式是在叶子页中保存主键值,通过这个主键值来回表(上图)查询到一条完整记录,因此按辅助索引检索实际上进行了二次查询,效率肯定是没有按照主键检索高的。下图是辅助索引的实现方式:

由于每个辅助索引都包含主键索引,因此,为了减小辅助索引所占空间,我们通常希望 InnoDB 表中的主键索引尽量定义得小一些(值得一提的是,MySIAM会使用前缀压缩技术使得索引变小,而InnoDB按照原数据格式进行存储。),并且希望InnoDB的主键是自增长的,因为如果主键并非自增长,插入时,由于写入时乱序的,会使得插入效率变低。

最后,我们要知道,B-Tree索引适用于等值匹配、范围匹配、键前缀匹配,这里的前缀指的是最左前缀。

测试

  1. 分别建立相同字段、索引列相同的俩长表,一个引擎是myisam, 一个是innodb

  2. 创建随机生成字符串和数字的函数,用于数据插入

3. 创建批量插入数据的函数

测试准备工作完成,开始

  1. 数据量在1w时,索引查询和非索引查询区别不大(红色箭头处为查询时间 单位秒)

  2. 数据量10W 索引查询区别不大, 非索引字段查询myisam要快些
  3. 数据量100w时 非索引字段查询myisam引擎的优势彰显出来了
  4. 数据量500w时 非索引字段查询myisam引擎的优势彰显出来了
    索引查询俩个引擎差不多,但是非索引查询差别就很明显了,innodb耗时10s以上,而myisam只有0.6s

    总结
    MYIASM和INNODB查询使用索引时性能相差无几
    但全表扫描时MYIASM查找的性能要好很多

来源:https://www.icode9.com/content-2-887651.html

(0)

相关推荐

  • MySQL索引是怎么支撑千万级表的快速查找?

    本文作者:何建辉(公众号:org_yijiaoqian) 前言 在 MySQL 官方提到,改善操作性能的最佳方法 SELECT 在查询中测试的一个或多个列上创建索引.索引条目的作用类似于指向表行的指针 ...

  • MySQL数据库的事务及存储引擎

    一.关系型数据库与非关系型数据库 1.关系型数据库的特点: 1)数据以表格的形式出现 2)每行为各种记录名称 3)每列为记录名称所对应的数据域 4)许多的行和列组成一张表单 5)若干的表单组成数据库 ...

  • Mysql中的索引

    Mysql中的索引

  • Mysql聚簇索引和非聚簇索引

    在mysql数据库中,myisam引擎和innodb引擎使用的索引类型不同,myisam对应的是非聚簇索引,而innodb对应的是聚簇索引.聚簇索引也叫复合索引.聚集索引等等. 聚簇索引:" ...

  • 性能调优-MySQL索引数据结构详解与索引优化

    本篇文章主要学习了MySQL的索引的数据结构的认识,做一个大概的了解即可. 一.索引 在关系数据库中,索引是一种单独的.物理的对数据库表中一列或多列的值进行排序的一种存储数据结构,它是某个表中一列或若 ...

  • innodb聚簇索引和myisam非聚簇索引

    通俗点讲 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内 ...

  • MySQL常用的几种查询场景

    查询出某班级的学生成绩及成绩排名 SELECT total.*FROM (SELECT obj.class, obj.total_score, CASE WHEN @rowtotal = obj.to ...

  • 开发者都需要了解的mysql索引四大存储引擎

    MySQL索引分为普通索引.唯一索引.主键索引.组合索引.全文索引.索引不会包含有null值的列,索引项可以为null(唯一索引.组合索引等),但是只要列中有null值就不会被包含在索引中. 接着让我 ...

  • MySQL同表相邻数据查询或计算(用户下相邻订单的时间差举例)

    这里主要介绍一下,在一张数据表下对相邻的数据进行一个相关查询和计算: 拿一个在电商中最常见的情况,计算一下用户首单和第二单的时间间隔这样的数据来举例,如下: id customer_id create ...

  • mysql update语句根据子查询结果把子查询数据写入修改字段

    需求,应用场景 table1是统计信息表,里面存储了商店id,一个商店一条数据,table2是订单表,里面存储了多个订单,每条订单有一个字段是table1的商店id,table3是商品表,存储了多个商 ...

  • MySql 入门到精通-sql查询语句的执行过程,你真的知道吗?

    首先,我们先来看看MySQL的基础架构,我们再平时写的最多的也就是 sql 查询语句,那么,对于一条简单的查询语句,你可否有想过它是如何执行的,期间又经历了哪些步骤呢?如下sql 查询: mysql& ...

  • MySQL 用 limit 为什么会影响性能?

    原文链接: https://mp.weixin.qq.com/s/XvtKuCeb8UWFAFsQM6kVhg 一,前言 首先说明一下MySQL的版本: mysql> select versio ...

  • 索引为什么能提高查询性能....

    重磅干货,第一时间送达 来源:小林coding 前言 昨天,有个女孩子问我提高数据库查询性能有什么立竿见影的好方法? 这简直是一道送分题,我自豪且略带鄙夷的说,当然是加「索引」了. 她又不紧不慢的问, ...

  • 性能衰减测试 还原汽车耐用性的真相

    俗话说"买车容易养车难",汽车虽然是个耐用消费品,但是买来后也不是一劳永逸.所以在甄选车辆时,除了考虑车辆外观.配置.车辆驾乘性能.油耗外,车辆的耐用性也变得尤为重要. 一般来说, ...

  • 超长安全性能等测试 如果磷酸铁锂锂电池

    超长安全性能等测试 如果磷酸铁锂锂电池