2021-01-05-MySQL库表设计
int类型区别及范围
int类型,4字节,32位,符号位的话就是[-231,231-1],无符号位的话最大值就是2^32-1。
bigint,8字节,64位,符号位的话就是[-263,263-1],无符号位的话最大值就是2^63-1。
自增ID会不会用完?
1、如果设置了主键并且自增的话,达到自增主键上限就会报错重复的主键key。
2、如果没有设置主键的话,InnoDB则会自动帮你创建一个6个字节的row_id,由于row_id是无符号的,所以最大长度是2^48-1(281万),但是新数据会覆盖老数据。
数据结构
MYISAM
如果要查询id = 40的数据:先根据MyISAM索引文件(如下图左)去找id = 40的节点,通过这个节点的数据区拿到真正保存数据的磁盘地址,再通过这个地址从MYD数据文件(如上图右)中加载对应的记录。
MyISAM.png
InnoDB
主键索引
数据库表行中数据的物理顺序和键值的逻辑顺序相同,主键索引的叶子节点保存的是真正的数据。叶子节点的数据区保存的就是真实的数据,在通过索引进行检索的时候,命中叶子节点,就可以直接从叶子节点中取出行数据。
主键索引.png
二级索引
二级索引.png辅助索引叶子节点的数据区保存的是主键索引关键字的值,假如要查询name = C 的数据,其搜索过程如下:
先在辅助索引中通过C查询最后找到主键id = 9.
在主键索引中搜索id为9的数据,最终在主键索引的叶子节点中获取到真正的数据。
所以通过辅助索引进行检索,需要检索两次索引。
之所以这样设计,一个原因就是:如果和MyISAM一样在主键索引和辅助索引的叶子节点中都存放数据行指针,一旦数据发生迁移,则需要去重新组织维护所有的索引。
最左匹配
当进行匹配的时候,会把字符串转换成ascll码,如abc变成97 98 99,然后从左往右一个字符一个字符进行对比。所以在sql查询中使用like %a 时候索引会失效,因为%表示全匹配,如果已经全匹配就不需要索引,还不如直接全表扫描。
最左匹配.png
区别
Innodb与Myisam区别.png索引创建原则(传说中的Three-star index)
传说中的Three-star index
Lahdenmaki and Leach’s book also introduces a three-star system for grading how suitable an index is for a query.
The index earns one star if it places relevant rows adjacent to each other,
a second star if its rows are sorted in the order the query needs,
and a final star if it contains all the columns needed for the query.
查询谓词都能够通过index进行扫描
排序谓词都能够利用index的有序性
index包含了查询所需要的所有字段
实战原则
- 列的离散型
count(distinct column_name):count(*),就是用去重后的列值个数比个数。值在 (0,1] 范围内。离散型越高,选择型越好。 - 最左匹配原则
- 最少空间原则
当关键字占用的空间越小,则每个节点保存的关键字个数就越多,每次加载进内存的关键字个数就越多,检索效率就越高。创建索引的关键字要尽可能占用空间小 - 联合索引
- 覆盖索引
如果查询的列,通过索引项的信息可直接返回,则该索引称之为查询SQL的覆盖索引。覆盖索引可以提高查询的效率。