MYSQL相关知识(一)

312 阅读3分钟

JYM大家好,这里是布洛妮娅, 鸭鸭的更文频道😎,本篇文章是对MYSQL的一个学习记录和总结!!

一、B-tree做为数据库索引的优势在哪里?

索引要存在磁盘上,难以批量读敗到内存。所以对素引的使用,每次只能读取一个节点,根据解析节点内容才知道接下来再去读取哪里的下一个节点。

在这个背景下,因为多路树可以自定义每一层往下分多少路,意味着可以言定义每一个节点存储的数据个数,这就使得我们可以往一个节点多塞数据,直到撞满一个数据库读取页(4 个操作系统读取页),从而使得一个节点塞很多数据,极度减少层数。一般来说,3-4 层就可以满足单表索引查询诉求。

因为少量层可以支持很多数据,所以在逐步追加节点建立索引树的过程中,可以优先撑满层数,然后通过重排,丰富每个节点的数值,扩增分支;这种方式使得多路树在绝大多数时候,能够保持绝对平衡,层级齐平。这为后续的一些扩展优化提供了先决条件.

二、联合索引为什么要关注列排序?

本质是因为比较时,先由最左边的列是否等值进行分路,然后再看从左边数第二列、第三列,依次类推.

这意味着,当查询条件里边,最常用列(最左列)没有等值条件,其余列的条件无法使用此索引.

如果两列常用度一样,则优先通过建索引时写在左边的列分路,所以高散度高的可以快速缩小比较范围,获得更小的结果集,应该把离散度高的列放在左边。当然,如果竟然有 2列一样常用、一样离散度,又需要建联合索引,那就用最少空间的放左边不按照上述注意事项排列顺序,轻则造成性能低,重则造成有些查询无法使用索引.

三、什么是回表?

InnoDB 通过辅助索引先查出主键值,再通过主键索引重新查数据的过程.

四、为什么会出现回表?

因为主键索引会为了绝对平衡,一直重排。每次重排会有多个地址改交,所以辅助索引的更新量会非常大。权衡之下,辅助索引保留主键值,更划算.

在这种思考下,辅助索引保存了主键值,没有保存数据地址。那么为了获得辅助索引本身不包含的数据,就需要再到主键索引查一遍行记录,就形成了回表.

五、回表操作带来的影响?

又有一组磁盘读取,降低了效率.

六、如何减少回表?

通过联合索引,把待查字段的值,放到索引里边,可以滅少回表.这一步也叫覆盖索引.

存储引擎了解:
MyISAM和InnoDB表引擎的区别

口诀:
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范国之后全失效;
Like百分写最右,覆盖索引不写星;