一、查询过程
以 select id from T where k=5 这条语句为例,普通索引先搜索到叶子节点,在数据页的内部以二分法找到数据。
普通索引:先找到满足记录后,还需要继续查找,直到第一个不满足这个条件为止。
唯一索引:找到满足条件的记录后就返回。
1.mysql的引擎查询数据的逻辑
mysql的引擎是InnoDB,是按数据页查找数据的,在查找数据时会把数据以数据页的形式从硬盘中加载到内存中,所以普通索引多查一条数据也就是在内存中的指针移动,cpu的消耗可以忽略不计。
二、更新过程
1.什么时候使用change buffer?
数据的更新的时候不需要唯一性验证的时候可以用change buffer,如果在查询数据的时候,内存中已经有数据页了(默认16k),这个时候就内有必要用change buffer了,change buffer 会占用buffer pool的内存,可用innodb_change_buffer_max_size来设置最大值,比如50,就表示change buffer的最大值为buffer pool的50%。
所以对于写多读少的业务场景使用change buffer是最合适的,常见的业务场景有账单类,日志类。
2. 什么叫做change buffer的merge
change buffer记录的是数据更新的变化,当更新结束后,再次有查询请求时,mysql会把数据页加载到内存,然后根据change buffer的记录把数据改成正确值得过程称为merge。
三、思考题
通过图 2 你可以看到,change buffer 一开始是写内存的,那么如果这个时候机器掉电重启,会不会导致 change buffer 丢失呢?change buffer 丢失可不是小事儿,再从磁盘读入数据可就没有了 merge 过程,就等于是数据丢失了。会不会出现这种情况呢?
对于redo log持久化过的数据不会丢失,没有持久化的数据会丢失,但都不会影响数据的一致性。因为在更新的事务中,change buffer会经过事务,在change buffer更新后,会保存redo log日志里,然后redo log日志会持久化bin log,如果在持久化之前,事务会回滚,不会影响数据的一致性。