
## 数据库索引
### 前置知识
#### B+树
- 特点
- 叶子存放数据
- 叶子组成链表
- 用作索引的优势
- 查询性能好
- 适合范围查询
- 节约内存
#### 不同角度的分类
- 覆盖索引和非聚簇索引
- 唯一索引
- 前缀索引
- 组合索引
- 全文索引
- 哈希索引
#### 最左匹配原则
- 口诀:AND用 OR不用,正用反不用,范围则中断
#### 代价
- 消耗磁盘空间
- 消耗内存空间
- 同步维护索引的开销
### 亮点方案
#### MySQL为什么使用B+树?
- 核心要求:要对范围查询友好、要对内存友好
- 对应疑问
- 为什么不用B树?
- 为什么不用二叉树、红黑树?
- 为什么不用链表?
#### 为什么不使用索引?
- !=、LIKE等查询
- 区分度不大
- 特殊表达式
- 数据量太小
#### 索引与NULL
- 说明:不同数据库可能有差异
- 内容
- 尽可能使用索引
- 唯一索引允许有多个NULL
实际情况(在php做分表麻烦? 中加多加个动态表名就ok了,脚本代码还是要简单粗暴的)
叶子存放了数据,而非叶子节点只是存放了关键字。
叶子节点被链表串联起来了。
B+ 树的高度和二叉树之类的比起来更低,树的高度代表了查询的耗时,所以查询性能更好。 B+ 树的叶子节点都被串联起来了,适合范围查询。
B+ 树的非叶子节点没有存放数据,所以适合放入内存中。

很多人说,MySQL每张表最好不要超过2000万条数据,否则就会导致性能下降。阿里的Java开发手册上也提出:单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。
但实际上,这个2000万或者500万都只是一个大概的数字,并不适用于所有场景,如果盲目的以为表数据只要不超过2000万条就没问题了,很可能会导致系统的性能大幅下降。
实际情况下,每张表由于自身的字段不同、字段所占用的空间不同等原因,它们在最佳性能下可以存放的数据量也就不同。
那么,该如何计算出每张表适合的数据量呢?别急,慢慢往下看。
阅读本文你需要有一定的MySQL基础,最好对InnoDB和B+树都有一定的了解,可能需要有一年以上的MySQL学习经验(大概一年?),知道 “InnoDB中B+树的高度一般保持在三层以内会比较好” 这条理论知识。
本文主要是针对 “InnoDB中高度为3的B+树最多可以存多少数据” 这一话题进行讲解的。且本文对数据的计算比较严格(至少比网上95%以上的相关博文都要严格),如果你比较在意这些细节并且目前不太清楚的话,请继续往下阅读。
阅读本文你大概需要花费10-20分钟的时间,如果你在阅读的过程中对数据进行验算的话,可能要花费30分钟左右。