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才读取到数据
- 一行数据, 大概20字节, 而Innodb最小的一页是16kb
- 因为我第一次IO取a=1时不够16KB, 那么就一直取到16kb为止, 取到内存中 所以原本要取7次, 但是实际只取了1次IO
P12 - MySQL是如何选择最优的索引 (和标题关系不大)
P13 - 覆盖索引底层原理和执行流程(和标题关系不大)
总结: 索引的本质就是目录
索引就是目录, 我想看第三章的内容, 就直接从第30页开始看, 而不是从第1页开始
目录存的是该组最小的值, 比如1-9, 存1