mysql怎么找二叉树 mysql查询树形结构( 三 )


redo log是循环写的,空间固定会用完;binlog是可以追加写入的 。追加写是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志 。
UndoLog
UndoLog 一般是逻辑日志,主要分为两种:
insert undo log
代表事务在insert新记录时产生的undo log, 只在事务回滚时需要,并且在事务提交后可以被立即丢弃
update undo log
事务在进行update或delete时产生的undo log; 不仅在事务回滚时需要,在快照读时也需要;所以不能随便删除 , 只有在快速读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除
3、MySQL中的索引
索引的常见模型有哈希表、有序数组和搜索树 。
哈希表:一种以KV存储数据的结构,只适合等值查询 , 不适合范围查询 。
有序数组:只适用于静态存储引擎,涉及到插入的时候比较麻烦 。可以参考Java中的ArrayList 。
搜索树:按照数据结构中的二叉树来存储数据,不过此时是N叉树(B+树) 。广泛应用在存储引擎层中 。
B+树比B树优势在于:
B+ 树非叶子节点存储的只是索引,可以存储的更多 。B+树比B树更加矮胖,IO次数更少 。
B+ 树叶子节点前后管理 , 更加方便范围查询 。同时结果都在叶子节点,查询效率稳定 。
B+树中更有利于对数据扫描,可以避免B树的回溯扫描 。
索引的优点:
1、唯一索引可以保证每一行数据的唯一性
2、提高查询速度
3、加速表与表的连接
4、显著的减少查询中分组和排序的时间
5、通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能 。
索引的缺点:
1、创建跟维护都需要耗时
2、创建索引时 , 需要对表加锁,在锁表的同时,可能会影响到其他的数据操作
3、 索引需要磁盘的空间进行存储,磁盘占用也很快 。
4、当对表中的数据进行CRUD的时 , 也会触发索引的维护,而维护索引需要时间,可能会降低数据操作性能
索引设计的原则不应该:
1、索引不是越多越好 。索引太多 , 维护索引需要时间跟空间 。
2、 频繁更新的数据,不宜建索引 。
3、数据量小的表没必要建立索引 。
应该:
1、重复率小的列建议生成索引 。因为重复数据少,索引树查询更有效率,等价基数越大越好 。
2、数据具有唯一性 , 建议生成唯一性索引 。在数据库的层面,保证数据正确性
3、频繁group by、order by的列建议生成索引 。可以大幅提高分组和排序效率
4、经常用于查询条件的字段建议生成索引 。通过索引查询,速度更快
索引失效的场景
1、模糊搜索:左模糊或全模糊都会导致索引失效,比如'%a'和'%a%' 。但是右模糊是可以利用索引的 , 比如'a%'。
2、隐式类型转换:比如select * from t where name = xxx , name是字符串类型,但是没有加引号,所以是由MySQL隐式转换的,所以会让索引失效 3、当语句中带有or的时候:比如select * from t where name=‘sw’ or age=14
4、不符合联合索引的最左前缀匹配:(A,B,C)的联合索引 , 你只where了C或B或只有B,C
关于索引的知识点:
主键索引:主键索引的叶子节点存的是整行数据信息 。在InnoDB里,主键索引也被称为聚簇索引(clustered index) 。主键自增是无法保证完全自增的哦,遇到唯一键冲突、事务回滚等都可能导致不连续 。
唯一索引:以唯一列生成的索引,该列不允许有重复值 , 但允许有空值(NULL)

推荐阅读