mysql怎么维护索引 mysql索引实现原理( 八 )


从MyISAM所支持的锁中也可以看出,MyISAM是一个支持读读并发,但不支持通用读写并发,写写并发的数据库引擎,所以它更适合用于读多写少的应用场合,一般工程中也用的较少 。
InnoDB中的锁
该模式下支持的锁实在是太多了,具体如下:
共享锁和排他锁 (Shared and Exclusive Locks)
意向锁(Intention Locks)
记录锁(Record Locks)
间隙锁(Gap Locks)
临键锁 (Next-Key Locks)
插入意向锁(Insert Intention Locks)
主键自增锁 (AUTO-INC Locks)
空间索引断言锁(Predicate Locks for Spatial Indexes)
举个栗子,比如行锁里的共享锁跟排它锁:lock in share modle 共享读锁:
为了确保自己查到的数据没有被其他的事务正在修改,也就是说确保查到的数据是最新的数据,并且不允许其他人来修改数据 。但是自己不一定能够修改数据,因为有可能其他的事务也对这些数据使用了 in share mode 的方式上了S 锁 。如果不及时的commit 或者rollback 也可能会造成大量的事务等待 。
for update排它写锁:
为了让自己查到的数据确保是最新数据,并且查到后的数据只允许自己来修改的时候,需要用到for update 。相当于一个 update 语句 。在业务繁忙的情况下,如果事务没有及时的commit或者rollback 可能会造成其他事务长时间的等待,从而影响数据库的并发使用效率 。
Gap Lock间隙锁:
1、行锁只能锁住行 , 如果在记录之间的间隙插入数据就无法解决了 , 因此MySQL引入了间隙锁(Gap Lock) 。间隙锁是左右开区间 。间隙锁之间不会冲突 。
2、间隙锁和行锁合称NextKeyLock,每个NextKeyLock是前开后闭区间 。
间隙锁加锁原则(学完忘那种):
1、加锁的基本单位是 NextKeyLock,是前开后闭区间 。
2、查找过程中访问到的对象才会加锁 。
3、索引上的等值查询,给唯一索引加锁的时候 , NextKeyLock退化为行锁 。
4、索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候 , NextKeyLock退化为间隙锁 。
5、唯一索引上的范围查询会访问到不满足条件的第一个值为止 。
mysql--索引优化索引覆盖是指如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘再找数据 。这种查询速度非常快,称为”索引覆盖”
1查询频繁2区分度高3长度小4尽量能覆盖常用查询字段
索引长度直接影响索引文件的大小,影响增删改的速度,并间接影响查询速度(占用内存多) 。因此对于一些长短不同的字节,我们会针对列中的值,从左往右截取部分,来建索引 。但是:
1:截的越短, 重复度越高,区分度越小, 索引效果越不好
2:截的越长, 重复度越低,区分度越高, 索引效果越好,但带来的影响也越大--增删改变慢,并间影响查询速度.
所以,我们要在区分度 + 长度两者上,取得一个平衡( distinct 去重 )
select count (distinct left (word,6)) / count (*) from tablename;
对于一般的系统应用区别度能达到 0.1 ,索引的性能就可以接受.
alter table tablename add index word(word(4));
给字符串类型的字段建立索引效率不高,但是必须要经常查这个字段怎么建索引?
比如说一个字段url , 类型是字符串 。那么可以建一个字段 crcurl 来存储url字段crc32后的值,并给 crcurl 建立索引 。
crc32:循环冗余校验 。根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数 , 主要用来检测或校验数据传输或者保存后可能出现的错误 。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化 。一般来说,循环冗余校验的值都是32位的整数 。

推荐阅读