b树和外部存储
2-3树和2-3-4树插入时的不同
2-3树插入过程中碰到满的非叶子节点不需理会,一直找到要插入的叶子节点,如果是满的就进行分裂操作,不满就直接插入。属于自底向上的分裂。向上分裂的数据项只有和要插入的数据项比较后才能确定。
2-3-4在插入新的数据项的过程中只要碰到满的节点就开始向上分裂。他的数据项是有序的,所以分裂的是中间的数据项。
外部存储
磁盘中的数据存储是以块为单位,根据系统的不同称为块,页,分配单元等名字。块的大小根据操作系统确定。磁盘驱动器每次读或写至少一个数据块这样效率最高
B树
每一个节点可以当作一个块,节点中保存Data(关键字+文件数据)和子节点的引用,查找时把含有根的块读入内存,比较关键字确定要读取的子节点的位置然后读入字节点对应的块,持续这个过程。直到找到这个数据。插入时类似于2-3树,把一半的数据分裂到新节点中剩下的一半在原节点中,把对应的中间数据项上移到父节点中,这种自底向上的操作保证了每个节点的数据项尽可能是满的。
索引
B+树索引
顺序索引+B树
非叶子节点只存储索引值,所以高度比B树矮,磁盘IO次数更少
所有的叶子节点都有一个链指针指向下一个叶子节点且有序,所以方便在叶子节点做范围统计,利于对数据库的扫描。
非叶子节点的指针树和关键字个数相同
叶子节点存储我们真正需要的数据,所以B+树每次都需要检索到叶子节点。且查询效率稳定
hash索引
不能使用组合索引
不能使用范围查询,仅满足“=”,“IN”操作
当key值重复多时即hash冲突严重时性能降低。
聚合索引(也叫密集索引)
- innodb中
若一个主键被定义,则该主键作为密集索引。若没有用该表第一个唯一非空索引做聚合索引。不满足以上条件innodb内部生成一个隐藏主键。非聚合索引中非叶子节点存储key值叶子节点存储主键值**。主键索引存储整张表的行记录数据。innodb中每张表只有一个聚合索引
mysql优化器会选择最有的情况,不一定选择主键索引。
- myisam
使用稀疏索引。叶子节点中不存储表数据(表数据存储在.myd文件中)而是存储表数据地址。
如何定位并优化满查询sql
根据慢日志定位慢查询信息
show variables like %quer%;
set global show_query_log = true //打开满查询日志
set global long_query_time = 1//设置时间,执行超过这个时间就记录,也可在my.ini中永久配置
explain关键字段
- type
- extra
using where 表示找到根据索引找到表查询数据
- 匹配全值
- 对索引的值能够进行范围查找 type=range
- 匹配最左前缀,用户复合索引
- 仅仅对索引进行查询 此时extra是using Index,不需要索引回表查找
最左匹配原则