存储引擎

与Oracle, SQL Server这些数据库不同,MySQL提供了多种存储引擎。什么是存储引擎?存储引擎其实就是一套对于数据如何存储,查询,更新,建立索引等接口的实现。不同存储引擎特性有所不同,我们根据需要进行选择,比如包含ETL操作的OLTP(联机交易处理)项目中我们通常选择InnoDB,而对于读操作较多几乎没有写操作的OLAP(联机分析处理)则选MyISAM的更多。因此并不是大家都用环境相似,同一版本的MySQL,能够使用的特性就是一致的。在MySQL终端中查看支持的存储引擎,默认值及简单介绍:

SHOW ENGINES;

在我使用的版本中,存在10种存储引擎,默认使用的是InnoDB。

在创建表时指定使用的存储引擎:

CREATE TABLE IF NOT EXIST mytest (foo VARCHAR(32))ENGINE=InnoDB;

查看已创建表使用的存储引擎:

SHOW CREATE TABLE mytest;

尽管MySQL提供了多种数据存储引擎,但我们接触最多的还是MyISAM和InnoDB,这两种存储引擎都已经过了大量的实践,非常可靠。

MyISAM

MyISAM是早期版本(MySQL 5.5.5之前)默认的存储引擎,特点是不支持事务,外键和行级锁。使用表级锁,加锁粒度比较大,开销比较小,但也因此增加了在做数据更新时冲突的可能性,比较适合查询为主的业务。值得一提的一个细节是,MyISAM将数据表行数直接存储起来,因此不含条件的count搜索将在常数时间内得到结果。MyISAM支持B-tree/FullText/R-tree索引类型。

InnoDB

新版本已经把InnoDB作为默认的存储。相比MyISAM,InnoDB有比较完善的事务支持,同时也支持外键和行级锁。这些特性使得InnoDB在面对数据更新密集型的场景下依然是非常强大的解决方案。InnoDB的索引在缓存数据的同时也缓存自身,这将导致更大占用更多的存储空间,下文将更详细的讨论索引相关的内容。InnoDB也支持我们常用的auto_increment属性。InnoDB支持Hash/B-tree索引类型。

其他存储引擎

如前所述,MySQL还提供其他多种存储引擎,如用于临时表,存储位置位于内存中,常用来作缓存的MEMORY,和将数据压缩归档存储的ARCHIVE,但我个人对这些存储引擎接触不多,大家可以参阅网上的其他资料。

索引

索引是一种为了加速对数据表的查询操作而维护的一种额外的数据结构。我们通常根据某些规则(如针对某一经常出现在where条件中的列)对表建立索引,这样之后对于这类查询就会非常高效。在MySQL中表的主键及建立的外键(如果被支持)上会被自动添加索引。但也正因为索引是一种额外维护的数据结构,因此它不但会占用更多的存储空间,也会为数据的插入和更新带来额外的负担。谨慎而合理的为表添加索引,是提高MySQL性能的重要手段。关于索引的更详细内容,MySQL索引背后的数据结构及算法原理写的非常好。

B-Tree和B+Tree索引

B-Tree是一种平衡多叉树,查询过程中通过待查询的值与比较节点内的值,决定匹配返回找到,或不匹配时通过某一分支向下层递归查找,或不能继续递归查找时返回查找失败。在这样的树中查找算法的时间复杂度降低至对数级别,非常高效。但为了维护这颗B-Tree的有序性质与平衡,数据在插入和更新时将带来额外的开销,关于平衡树的增删改查的具体算法,感兴趣的同学可以通过查询阅读一下,这里就不讨论了。

B-Tree具有很多变种,B+Tree就是其中之一。B+Tree与B-Tree的显著区别之一是,B+Tree的数据全部存储于叶子节点,因此每一次查询一定会到达树的底层。现代数据库经常为B+Tree做一些额外的优化,例如在底层节点之间增加指针,从而对于叶子节点形成一种类似链表 (或一种长的比较特别的跳表) 的结构,以加速遍历和区间查询。红黑树等经典数据结构并没有被用作数据库的主要实践,原因与磁盘IO性能考虑等较为抽象的原因有关,这在本文末尾的链接页面中有所提及。

MySQL中的索引

MySQL支持的多种存储引擎对于索引有着不同的支持。

在MyISAM存储引擎中,默认使用B+Tree作为索引方式。在MyISAM中,数据与索引是分离的,B+Tree的叶子节点中存储着指向真实数据的指针,查询过程在经过索引后的到这一指针,根据指针指向的值返回结果。MyISAM的索引方式被成为非聚集索引。

InnoDB存储引擎同样使用B+Tree作为索引方式,但具体实现并不相同。在InnoDB中,数据本身就存储于根据主键组织的B+Tree之上,因此InnoDB的表中不能没有主键。另一个需要提及的特点是,对于基于InnoDB存储引擎的表上的其他辅助索引,同样基于B+Tree,但最终的到的值是对应数据的主键,换言之,一次查询过程将会分为两个阶段,在经过一轮索引后,如果查找成功,会持有对应数据的主键值再去存储着真实数据并基于主键组织的B+Tree上查找一次。InnoDB的索引方式被称为聚集索引。

实践

基本性能分析手段

查看某一张表上存在着哪些索引:

SHOW INDEX FROM mytest;

如果想了解某一条查询语句对于索引的使用,可以使用在命令前加入EXPLAIN。显示最近使用EXPLAIN的查询所消耗的时间:

SHOW PROFILES;

基本优化策略

了解了索引背后的基本原理,以及基本的分析手段,为我们高效使用索引提供了思路。如何对DB进行优化是一件比较精致的事,与具体情况有关。很多不当的SQL语句会使精心建立的索引无能为力,比如多个(>1)范围列,缺少联合索引中的中的某些列(最糟糕就是缺少最左匹配中的第一列),含有函数或表达式,选择性(按索引规则过滤的非重复数量与全部记录数量的比值)过低等。

除了针对高频查询操作添加的辅助索引外,主键的选择也有一定学问。结合InnoDB存储引擎索引方式与底层存储细节,简单的来说,使用一个与逻辑无关的自增字段作为主键是个好主意。

mysql存储引擎 索引优化_MySQL存储引擎,索引及基本优化策略相关推荐

  1. mysql的存储引擎详解_Mysql存储引擎详解

    存储引擎的介绍 关系型数据库表是用来存储和组织信息的数据结构,可以将表理解为由行和列组成的表格. 由于表的类型不同,我们在实际开发过程中,就有可能需要各种各样的表,不同的表就意味着存储不同类型的数据, ...

  2. mysql+索引优化+查询优化+存储优化_mysql利用覆盖索引避免回表优化查询

    前言 说到覆盖索引之前,先要了解它的数据结构:B+树. 先建个表演示(为了简单,id按顺序建): id name 1 aa 3 kl 5 op 8 aa 10 kk 11 kl 14 jk 16 ml ...

  3. mysql存储引擎静态表_MySQL存储引擎(表类型)的选择

    一.MySQL存储引擎概述 MySQL与多数数据库不同的是包含存储引擎这一特性,用户可以根据应用的需要选择合适的存储引擎来使存储和索引数据,以及是否使用事务等.MySQL5.0支持的存储引擎包括MyI ...

  4. mysql存储引擎简书_MySQL存储引擎详解

    一,基础 1,插件式存储引擎,允许第三方组织,根据其api来设计,很多功能需要依赖引擎支持,比如事务 2, 5.5以后默认为innodb,之前为myISAM,innodb支持事务,myISAM不支持 ...

  5. mysql innodb和myisam区别_MySQL?存储引擎简介

    ​大家好,我是anyux.本文介绍MySQL存储引擎. 简介 相当于Linux文件系统,只不过比文件系统强大 功能 数据读写 数据安全和一致性 提高性能 热备份 自动故障恢复 高可用方面支持 引擎类别 ...

  6. mysql索引下沉_MySQL 5.6 索引条件下推优化

    索引下推优化是MySQL5.6版本中新加的功能. 索引条件下推(ICP)是对MySQL使用索引从表中检索行的情况的优化.如果没有ICP,存储引擎会遍历索引以查找基表中的行,并将它们返回给MySQL服务 ...

  7. mysql order by 索引名字_MySQL如何利用索引优化ORDER BY排序语句

    MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通 ...

  8. mysql 聚簇索引和非聚簇索引_MySQL学习之——索引

    转自:CSDN MySQL是目前绝大多数互联网公司使用的关系型数据库,它性能出色.资源丰富.成本低廉,是快速搭建互联网应用的首选关系型数据库.但是,俗话说,"好马配好鞍",仅仅会使 ...

  9. mysql 1千万 like优化_MYSQL千万级数据量的优化方法积累

    1.分库分表 很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表mem ...

最新文章

  1. 科大星云诗社动态20210905
  2. Entity Framework 4 in Action读书笔记——第一章:数据访问重载:Entity Framework(2)...
  3. 腾讯哈勃_用Python的黑客统计资料重新审视哈勃定律
  4. 函数式编程的Java编码实践:利用惰性写出高性能且抽象的代码
  5. Zabbix 3.0 部署监控 [二]
  6. php chinese word
  7. scratch成绩查询 电子学会图形化编程scratch等级考试四级真题和答案解析2022年6月
  8. DBSCAN 对点云障碍物聚类
  9. Ie8兼容性问题web.config设置
  10. cad图形不见了怎么办_CAD画图突然消失 怎么找回
  11. 使用 Kubernetes 和 Istio 进行基于容器的全面服务监控
  12. .net 统计图 导出_利用solidwords二次开发导出三维曲面方阵点坐标方法
  13. ap计算机sql,如何用sql实现AP
  14. 第12期 【鸟随鸾凤飞腾远】 7月刊
  15. CentOS 8 使用BBR加速
  16. Linux Ubuntu常用命令总结
  17. 龙卷风收音机APP3.9.6数据包备份恢复(2023.2.17)
  18. 3.前端笔记之JavaScript基础
  19. python之最小公倍数
  20. HTML5 简介及基础教程

热门文章

  1. php开发总结,PHP开发规范总结
  2. 通用计算机的时代,MIT论文:通用计算机时代即将终结
  3. Ajax通讯异常12002,前端MVC框架[02] 发送AJAX请求及建立连接池
  4. matlab 聚类 源程序,聚类——KFCM的matlab程序
  5. python查看与修改工作目录
  6. 解决使用sudo没问题,但是使用su会报错 su: Authentication failure 的问题
  7. shell编程快捷方法
  8. python入门教程第三讲_第三讲 使用Template
  9. cv2.error: opencv(4.4.0)_【从零学习OpenCV 4】图像金字塔
  10. js时间格式化函数(兼容IOS)