1、数据库中最常见的慢查询优化方式是什么?
加索引
2、为什么加索引能优化慢查询?
索引其实是一个数据结构,B+树。
B+树
一个m阶的B+树具有如下几个特征:
1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
B+树的优势:
1.单一节点存储更多的元素,使得查询的IO次数更少。
2.所有查询都要查找到叶子节点,查询性能稳定。
3.3.所有叶子节点形成有序链表,便于范围查询。
3、你知道哪些数据结构可以提高查询速度?
哈希表、完全平衡二叉树、B+树。
4、那这些数据结构既然都能优化查询速度,mysql为何选择用B+树?
一个节点里面可以存多个元素:磁盘IO
元素有冗余+叶子节点之间有指针:范围查找
B+树的优势(见上面)
5、为什么一个节点为1页(16K)就够了?
假如有个高度为2的B+树:
result = 叶子节点数 * 一个叶子节点里能存放的数据条数
叶子节点数 = 根节点的指针数 = {索引值+ 指针}组合数 = 索引值个数
假设一行数据的大小-=1KB(合理的值)
一个叶子节点能够存放的数据条数?16KB / 1KB = 16条
索引值个数?16KB / {int类型索引值8B + 指针6B} (14B) = 16KB / 14B = 1170
result = 1170*16=18720
B+树高度为2 : 1170*16=18720
B+树高度为3: 1170 * 1170 * 16 = 21902400
6、mysql两种存储引擎下的B+树使用
InnoDB中的B+树:
InnoDB种主键索引的叶子节点的数据区域存储的是数据记录,辅助索引存储的是主键值:
辅助索引:
MyISAM中的B+树:
MYISAM中叶子节点的数据区域存储的是数据记录的地址。
7、B+树 VS B树:
B+树的非叶子节点不存储数据,只有叶子节点才存储数据;
而B树的非叶子节点和叶子节点都会存储数据,会导致非叶子节点存储的索引值
会更少,树的高度相对会比B+树高,平均的I/O效率会比较低,所以使用B+树作
为索引的数据结构。
再加上B+树的叶子节点之间会有指针相连,也方便进行范围查找。
8、InnoDB总结:
InnoDB中的主键索引和实际数据是绑定在一起的,也就是说InnoDB的一个表一
定要有索引,如果一个表没有手动建立主键索引,InnnoDB会查看有内有唯一索
引,如果有则选用唯一索引作为主键索引,如果连唯一索引也没有,则会默认建
立一个隐藏的主键索引(用户不可见)。
另外,InnoDB的主键索引要比MyISAM的主键索引查询效率要高(少一次磁盘IO),并且比辅助索引也要高很多。
所以,我们在使用InnoDB作为存储引擎时,我们最好:
1、手动创建主键索引
2、尽量利用主键索引查询
9、到底什么是索引?
大学老师定义:索引就像是输的目录。
mysql官网定义:indexes are used to find rows with specific column values quickly.
简单理解:索引是一种优化查询的数据结构。
10、 MySQL总结:
B+树可以更好的结合磁盘IO原理,提高查询效率。
Innodb一定要有主键,没有主键以唯一索引为主键,否则会建立一个隐藏主键
Innodb的数据是和主键索引存在一起的(数据在叶子节点中,MyISAM的叶子
结点数据区域存储的是数据地址)
建立索引时要考虑已有索引,一个sql语句只会选择花费最低的一个索引执行
索引是一种有序的数据结构(B+树),一个节点可以存多个有序的元素,所
以要利用好最左前缀原则。
11、MySQL索引的本质
索引是一种有序的数据结构
12、mysql索引的底层原理
B+树实现,具体见上面描述。
PS:一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以
索引文件的形式存储的磁盘上。
转载于:https://blog.51cto.com/jiaxiaoxu/2374395