MySQL存储引擎,索引及基本优化策略
存储引擎
与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存储引擎和索引
正确的创建合适的索引,是提升数据库查询性能的基础. 第一章 mysql之索引 索引的定义:索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构. 我们为什么要使用索引: a.极大的减少存储引 ...
- 为什么用B+树做索引&MySQL存储引擎简介
索引的数据结构 为什么不是二叉树,红黑树什么的呢? 首先,一般来说,索引本身也很大,不可能全部存在内存中,因此索引往往以索引文件的方式存在磁盘上.然后一般一个结点一个磁盘块,也就是读一个结点要进行一次 ...
- MySQL存储引擎MyISAM和InnoDB,索引结构优缺点
MySQL存储引擎MyISAM和InnoDB底层索引结构 深入理解MySQL索引底层数据结构与算法 (各种索引结构优缺点) Myisam和Innodb索引实现的不同(存储结构) 存储引擎作用于什么对象 ...
- MySQL存储引擎与索引
引言: MySQL存储引擎主要分为 InnoDB 存储引擎与 MyISAM 存储引擎.都采用B+数的存储结构. 应用场景: InnoDB适合:(1)可靠性要求比较高,要求事务:(2)大量 insert ...
- Database基础(二):MySQL索引创建与删除、 MySQL存储引擎的配置
一.MySQL索引创建与删除 目标: 本案例要求熟悉MySQL索引的类型及操作方法,主要练习以下任务: 普通索引.唯一索引.主键索引的创建/删除 自增主键索引的创建/删除 建立员工表yg.工资表gz, ...
- 第 3 章 MySQL 存储引擎简介
第 3 章 MySQL 存储引擎简介 前言 3.1 MySQL 存储引擎概述 MyISAM 存储引擎是 MySQL 默认的存储引擎,也是目前 MySQL 使用最为广泛的存储引擎之一.他的前身就是我们在 ...
- 数据库索引使用数据结构及算法, 及MySQL不同引擎索引实现
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- mysql存储引擎简析
一.常见存储引擎特性 Innodb 具有提交.回滚和崩溃恢复能力的事务安全.支持外键.使用mvcc以及行锁来提供事务支持,因此支持高并发.适用于写频繁,并发率高的应用. Myisam 不支持事务和灾难 ...
- SQL学习笔记三(补充-1)之MySQL存储引擎
阅读目录 一 什么是存储引擎 二 mysql支持的存储引擎 三 使用存储引擎 一 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的 ...
随机推荐
- 利用shell脚本使用kubeadm部署kubenetes 1.18.6集群环境
# README # 此脚本需要在master节点上使用 # 注意root密码,请提前修改 # 个人实验环境,注意机器最低配置:master(2G内存,1cpu2核心,否则集群会创建失败),node( ...
- 初识面向对象(Day17-Day18)
人狗大战的游戏 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍 ...
- nginx反向代理初体验
需求:部署两台tomcat,默认监听端口分别是8080和8081.访问nginx服务时,自动跳转到相应tomcat服务. 先部署一台机器:就宿主机上tomcat服务: 修改nginx配置:vim ng ...
- Welcom to my studyspace! 欢迎来到我的学习空间!
由于新手,博客才刚开始起步,用于记录我的学习,博客的建设后续需要将其完善 对我的博客进行diy 用于分享我的学习经历,一些笔记,还有一些小小的心得
- 『德不孤』Pytest框架 — 8、Pytest断言
目录 1.什么是断言 2.Pytest断言 3.Pytest的断言方式及应用场景 (1)使用assert语句 (2)断言预期的异常 (3)拓展 4.优化断言 5.使用标记检查异常 1.什么是断言 对于 ...
- S32Kxxx bootloader之CAN bootloader
了解更多关于bootloader 的C语言实现,请加我Q扣: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 最近完成了S32Kxx ...
- RFC3918组播组容量测试——网络测试仪实操
一.简介 1.RFC3918简介 历史 · 在1999年3月成为正式标准 功能 · 评测网络互连设备或网络系统的性能 · 网络设备: 交换机,路由器- 内容 · 定义了一整套测试方法,为不同厂家的设备 ...
- Golang 包管理机制
Golang 包管理机制 1. 历史 在go1.11之前, 并没有官方的包管理机制(Godep算个半官方), 主流的包管理机制有: GoVendor Glide Godep 在go1.11之后, 官方 ...
- 第一次接触数据库(SQLite)
第一次接触,学了创建列表 + 行的删除 + 内容的更改 + 删除列表 第一次接触要知道一些基本知识 NULL(SQL) = Nnoe(python) #空值 INTEGER = int #整数 R ...
- nmtui解决network-scripts目录下无网卡对应配置文件问题
1.问题出现的原因设备先安装了操作系统,后插上网卡到设备,就会出现/etc/sysconfig/network-scripts目录下无该网卡对应配置文件的问题,但是ifconfig命令能看见系统给该网 ...