[MySQL] P10-P17 索引的原理

92 阅读2分钟

P8 阿里巴巴MySQL军规

下面这个问题网上还有争议, Join到底怎么样, 还有待分析, 有说关系型数据库用Join正常

95%都使用单表查询(也就是尽量不要用Join), Join不能超过3张表, 多表关联要保证关联的字段有索引

a. 因为关联之后, 很难使用索引, 关联之后MySQL底层会有大量的计算, 性能差

b. 特别是数据量大的表, 尽量不要关联, 而是通过业务代码查询, 循环之后, 每个查询都走索引就行 比如商品表关联商品分类表, 先通过索引查询商品列表, 再循环, 通过索引查询出商品分类

P10 - InnoDB存储基本单位的 页结构详解

特点:

  • 页节点相邻之间有指针
  • 非页子节点中(枝干节点)冗余了一些页子节点的数据

P11 - 索引底层原理和执行流程 - 有例子

CREATE TABLE `t1` (
  `a` int(11) NOT NULL,
  `b` int(11) DEFAULT NULL,
  `c` int(11) DEFAULT NULL,
  `d` int(11) DEFAULT NULL,
  `e` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`a`)
) ENGINE=InnoDB;

InnoDB页的作用:

  • InnoDB最小的数据存储单位
  • innodb_page_size, 一页 16KB

案例: SELECT * FROM t1 WHERE a=7 , 取这条数据, 从1-7, 原本进行了7次磁盘IO才读取到数据

  1. 一行数据, 大概20字节, 而Innodb最小的一页是16kb
  2. 因为我第一次IO取a=1时不够16KB, 那么就一直取到16kb为止, 取到内存中 所以原本要取7次, 但是实际只取了1次IO

image.png

P12 - MySQL是如何选择最优的索引 (和标题关系不大)

P13 - 覆盖索引底层原理和执行流程(和标题关系不大)

image.png

总结: 索引的本质就是目录

image.png

索引就是目录, 我想看第三章的内容, 就直接从第30页开始看, 而不是从第1页开始 目录存的是该组最小的值, 比如1-9, 存1