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中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的 ...
随机推荐
- Java判断是否是回文字符串
public static boolean isPalindrome(String str) { int start = 0, end = str.length() - 1; while (start ...
- MySQL保留2位小数
1.round(x,d),四舍五入.round(x) ,其实就是round(x,0),也就是默认d为0 select round(110.35,1); # 110.4 2.TRUNCATE(x,d), ...
- 针对Office宏病毒的高级检测
前言 攻击者可能发送带有恶意附件的钓鱼邮件,诱导受害者点击从而获取对方的系统控制权限 期间会借助 Atomic 工具完成攻击复现,再对具体的过程细节进行分析取证,然后深入研究.剖析其行为特征 最后输出 ...
- k8s家族Pod辅助小能手Init容器认知答疑?
k8s家族Pod辅助小能手Init容器认知答疑? k8s集群Init 容器是一种特殊容器,职责是在Pod的生命周期中作为应用容器的前置启动容器. 在很多应用场景中,在 Pod 内的应用容器正式启动之前 ...
- [旧][Android] Retrofit 源码分析之 ServiceMethod 对象
备注 原发表于2016.05.03,资料已过时,仅作备份,谨慎参考 前言 大家好,我又来学习 Retrofit 了,可能这是最后一篇关于 Retrofit 框架的文章了.我发现源码分析这回事,当时看明 ...
- 在命令行中输入python会跳转到商店问题解决,python环境变量的配置
安装python出了点问题,明明安装了,在应用商店显示已获取,可是在命令行输入python检验时就直接跳转到win10系统自带的应用商店...... 这不免让我怀疑是不是没有安装好python~但是它 ...
- Oracle之PL/SQL Developer的下载与安装
PL/SQL是什么? PL/SQL Developer是一个集成开发环境(以下简称PL/SQL),专门开发面向Oracle数据库的应用.PL/SQL也是一种程序语言,叫做过程化SQL语言(Proced ...
- idea教程--如何申请免费的ideaIDE
开始申请前请先到 https://www.jetbrains.com/zh/student/ 阅读免费学生授权的介绍和常见问题,再依照下方流程进行申请. (1)到 https://www.jetbra ...
- 判断访问类型是pc端还是移动端
/** * 判断访问类型是电脑还是手机 */ $(function(){ var mobile_flag = isMobile(); // true为PC端 ...
- k8s 中 nfs作为存储的三种方式
1.安装nfs服务.直接给命令 yum install nfs-utils vim /etc/exports /data/k8s/ 172.16.1.0/24(sync,rw,no_root_squa ...