这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战
Mysql表结构原则
选择较小的数据类型
数据类型越小,占用磁盘、内存和CPU缓存更少,处理所需要的CPU周期也更少
整型比字符操作代价更低,因为字符集合校对规则使字符比较比整型比较更复杂
尽量避免NULL
如果查询中包含为null的列,对mysql来说更难优化,因为null的列让索引、索引统计和值更复杂。可以为null的列会使用更多的存储空间,在mysql里需要特殊处理。当可为null的列被索引时,每个索引记录需要一个额外的字节,在MyIsam里甚至可能导致固定大小的索引变成可变长度的索引。
B-Tree索引
Innodb使用B+Tree
MyIsam使用前缀压缩技术使得索引更小,Innodb按照原数据格式进行存储。
MyIsam索引通过数据的物理位置引用被索引的行,Innodb根据主键引用被索引的行。
B-Tree所有的值都是按照顺序存储的,每个叶子页到根的距离相同。
B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,而是从索引的根节点开始搜索。根节点的槽中存储了指向子节点的指针,存储引擎根据这些指针向下层查找。通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,这些指针定义了子节点页中值的上限和下限,最终存储引擎要么是找到对应的值,要么记录不存在。叶子节点比较特别,指针指向的是被索引的数据,而不是其他的节点
B-Tree对索引列是顺序组织存储的,所以很适合查找范围数据。
索引对多个值进行排序的依据是Create Table语句中定义索引时列的顺序。
B-Tree索引适合全键值、键值范围和键前缀查找,键前缀只适用于根据最左前缀来进行匹配查找。
全值匹配
全值匹配指的是和索引中的所有列进行匹配
B-Tree索引的缺点
B-Tree索引的缺点:
- 如果不是按照索引的最左列开始查找,无法使用索引。
- 不能跳过索引中的列
- 如果查询中某个列是范围查询,那么它右边所有列都无法使用索引优化查找。