首先关闭主动提交,执行修改语句 update employee set name = 'guangzhijiayou' where id = 1;
(1)客户端连接mysql的服务层,然后执行器调用innoDB引擎
(2)去BufferPool缓存找id=1的数据有没有在bufferPool中
1)bufferPool中有则更新对应数据
2)bufferPool中没有则去磁盘idb文件中加载对应数据,根据索引查找对应数据所属的数据页,找到之后会把这一条数据所属的一整页缓存到bufferPool中,然后把修改之前的缓存页放到undolog中进行备份。undolog用于数据回滚和事件隔离。
(3)更新完之后bufferPool中的页称为脏页(因为此时bufferPool中的这条数据和磁盘中的这条数据已经不一样了), 执行commit提交,把数据同步到磁盘,此时才会规复到正常页。
联合索引的优势
(1)减少开销
建一个联合索引(a,b,c),实际相当于建了(a),(a,b),(a,b,c)三个索引,但是只天生一个B+树,如果建立三个索引,必要天生三颗B+树。每多一个索引,都会增加写操纵的开销和磁盘空间的开销。对于大量数据的表,使用联合索引会大大的减少开销!
(2)覆盖索引
对联合索引(a,b,c)如果有如下sql的
select a,b,c from table where a='xxx' and b='xx;
那么mysql可以直接通过遍历索引取得数据,而无需回表,这减少了许多的随机io操纵。减少io操纵,特别是随机io其实DBA主要的优化策略.以是,在真正的实际应用中,覆盖索引是主要的提拔性能的优化本领
(3)服从高
索引列多,通过联合索引筛选出的数据越少.比如有1000w条数据的表,有如下sql:
select col1, col2,col3 from table where col1=1 and col2=2 and col3=3;
假设:假设每个条件可以筛选出10%的数据
A:如果只有单列索引,那么通过该索引能筛选出1000w*10%=100w条数据,然后再回表从100w调数据中找到符合col2=2 and col3=3的数据,然后再排序,再分页,以此类推(递归);
B:如果是(col1,col2,col3)联合索引,通过三列索引筛选出1000w*10%*10%*10%=1w,服从提拔。
9、索引的优缺点,什么时候用什么时候不用