数据库问题:IO问题(减少IO量、减少IO次数)
一、为什么不用hash表?
如果使用hash表进行存储的话,需要较好的hash算法,若算法不好的话会导致hash冲突和hash碰撞,导致数据散列不均匀;当需要进行范围查找的时候需要挨个遍历,效率很低。
其中,innodb 存储引擎支持自适应hash
二、二叉树、二叉搜索树BST、二叉查找树AVL、红黑树
插入更多的数据的时候,导致IO次数加大,影响效率
三、为什么不用B树而用B+树?
1、B树
B树:指针+索引+数据
举例说明: 查找索引为27的数据
首先,比较16和32得知27位于它们之间,因此由p2指针指向下一个磁盘块,再对25和31比较进入到下一个磁盘块,最后得到27的数据。
存储记录数: 假设一个磁盘块只有48kb,数据1kb,那么三层B树记录数最大为(48/3)(48/3)(48/3)较少
缺点:存储的数据量较少;若需要插入更多的数据,导致树的高度变大,增大查询时磁盘的IO次数,进而影响查询性能
2、B+树
B+树:数据只存在叶子节点中,非叶子节点存放指针和索引
存储的数据量大,降低了树的高度,数据检索快
三、聚簇索引和非聚簇索引
聚簇索引: 数据和索引绑定在一起存储
非聚簇索引: 数据和索引没有存储在一起
四、回表、索引覆盖、最左匹配、索引下推
五、MVCC
插入name=zhangsan,age=11,gender=man的数据,隐藏字段事务id=1,主键假设=1,因为没有回滚操作所以指针为null
undolog: 记录回滚日志,每一次数据修改都会在undolog中记录,并把指针移向最新的一次历史记录
下面4个事务分别开启,事务4先做修改操作并提交,然后事务2进行快照读取,可以查看到最新记录
事务0为最早的事务开启插入提交操作,事务1234分别开启事务,事务2先进行快照读,然后事务4进行修改操作并提交,接着事务2再进行快照读
RR隔离级别不能查看到最新的记录,因为RR只有在进行第一次快照读的时候才会生成readview,之后的读操作都会用第一次生成的readview;
RC隔离级别可以查看到最新的修改数据,因为RC每次进行快照读的时候都会生成新的readview;
六、ACID
原子性: 要么都执行要么都不执行,记录会写在undolog中,方便事务执行失败进行数据回滚
隔离性: MVCC多版本并发控制
持久性: redolog二阶段提交,防止宕机数据丢失
一致性: 上面的操作就是为了保证数据的一致性
若数据在写binlog之前发生断电,那么事务处在prepare阶段,判断redo和binlog文件内容是否一致,不一致则表示没有写入成功。若一致,只是没有提交,那么只要commit即可
|