目录
MySQL性能优化
一、理解MySQL核心的索引机制【B+tree】
1.索引谁实现的
2.索引的定义
A、什么是慢查询?
B、慢查询的优化? 【explain或加索引】
C、什么是索引?
D、什么是数据结构及常见数据结构?
E、索引及数据存放在磁盘上。
F、磁盘存取原理 一次磁盘I/O 磁盘的预读能力4k及4k整数倍
G、为什么要用索引?【意义】
3.为什么选择B+Tree
A、二叉树的不足【右边子元素大于父元素,左边相反】
B、平衡二叉树【AVL树】的不足
C、多路平衡查找树【B-Tree】
D、加强版多路平衡查找数【B+树】
4.B+Tree在两大引擎中如何体现
A、MySQL中B+Tree索引的体现形式 ----myiasm
B、MySQL中B+Tree索引的体现形式 ----innodb
C、两者对比myiam与innodb
5.索引知识补充
A、列的离散性
B、最左匹配原则
C、联合索引
6.总结及验证
二、熟悉MySQL运行机制,存储引擎,MySQL查询优化
1.MySQL体系结构及查询流程
2.MySQL各大插拔式的存储引擎
3.MySQL查询优化--查询执行的路径
三、深入innodb【事务隔离级别、锁机制、mvcc、undo...】
1.事务
2.锁
3.MVCC(多版本并发控制)
4.Undo Log
5.当前读、快照读
6.Redo Log
四、内存、缓存池、IOd等配置参数,合理的数据库表的设计
存储引擎定义在表结构上,一个库可以定义多个存储引擎,索引就是插把式存储引擎实现的。
超过指定时间的SQL语句查询。
正确的创建合适的索引 是提升数据库查询性能的基础。
索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。
数据结构是计算机存储、组织数据的方式。
常见的数据结构:数组、栈、队列、链表、树、图、堆、散列表。
索引能极大的减少存储引擎需要扫描的数据量。
索引可以把随机IO变成顺序IO。
索引可以帮助我们在进行分组、排序等操作时,避免使用临时表。
常见的二叉树如图
如果索引数据呈现递增就会出现线性链表如图
二叉树的不足:二叉树检索性能取决数据的分布,线性链表
AVL树:子节点的高度差不超过1【节点的平衡因子】 旋转操作
红黑树:就是平衡二叉树 不过红黑树更多的定义 黑节点的子节点一定是红节点
平衡二叉树的不足:
它太深了【IO次数多】:数据处的高度决定IO操作次数,IO操作耗时大。
它太小了【浪费IO效率】:
每一个磁盘块(节点/页)保存的数据太小了。
没有好利用磁盘IO的数据交换特性(4KB)。
没有利用好磁盘IO的预读能力(空间局部性原理),而带来频繁的IO操作。
多路:节点分支
关键字:最多有M路-1个
分裂或合并操作
每个叶节点保存数据、关键字、子节点的引用。
B-Tree与B+Tree区别
- B+Tree非叶节点不保存数据相关信息,只保存关键字和子节点的引用
- B+Tree关键字对应的数据保存在
- B+Tree叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系
- B+Tree节点关键字搜索采用左闭合区间
为什么选用B+Tree?
- B+Tree是B-Tree的变种【PLUS】绝对多路平衡查找数,有B-Tree的优势
- B+Tree扫库、表能力更强 B-Tree要扫描所有节点的数据区
- B+Tree的磁盘读写能力更强
- B+Tree的排序能力更强
- B+Tree的查询效率更加稳定(仁者见仁、智者见智)
MySQL在V5.5之前默认存储引擎是MyISAM;在此之后默认存储引擎是InnoDB
.frm文件 表定义文件
.myd文件 存放Data
.myi文件 存放Index
.frm文件 表定义文件
.ibd文件 索引和数据文件
Innodb是以主键为索引组织存储数据,没有指定主键索引时,默认生成6byte的int型隐式索引。
当主键不是整数类型时,会首先创建隐式主键索引和辅助索引,两次索引。
Count(distinct 列) 越大越好 图中是name列 离散性较好
字符串、中文、英文都可以比对 取决创表的排序规则。
adc会放右节点
下图产生雍余索引
D、覆盖索引
如果查询列可通过索引节点中的关键字直接返回,则该索引称之为 覆盖索引。
覆盖索引可减少数据库IO,将随机IO变为顺序IO,可提高查询性能。
现在,你能都理解了么?
索引列的数据长度能少则少。
索引一定不是越多越好,越全越好,一定是建合适的。
匹配列前缀可用到索引like 9999%, like %9999%、like %9999用不到索引;
Where条件中notln和o操作无法使用索引:
匹配范围值,order by也可用到索引;
多用指定列査询,只返回自己想到的数据列,少用select ♦:
联合索引中如果不是按照索引最左列开始査找,无法使用索引:
联合索引中精确匹配最左前列并范围匹配另外一列可以用到索引;
联合索引中如果査询中有某个列的范围査询,则其右边的所有列都无法使用索引: