mysql数据库读写索引和优化

Mysql数据库读和写

读快照,当前读

select*from**where**认为是快照读默认启动只有一条查询的事务,加forupdate就是当前读,其他事务未提交时当前读会阻塞;update和delete都是当前读

行锁、表锁、间隙所

行锁:主键列或索引列;主键和唯一索引力度最小最轻量级;普通索引锁满足条件的所有行表锁:无索引列间隙锁:发生在普通索引,插入时锁住不存在的列所在的间隙,比如6不存在,存在5,10那么就锁住5-10之间所有间隙,左开右闭普通索引满足5,10,15,20时,当前读=10的记录时,mysql会锁住10这一条,同时锁住5-10以及10-15的间隙不包含两端,防止中间的insert,主要是防止再插入一条10产生幻读

脏读、不可重复读、幻读

脏读:读到还未提交的数据不可重复读:两次读同一数据结果不一致,第一次读取更新前的数据,第二次读到更新后的数据幻读:两次读,第二次读比第一次多读到了新增的数据

事务隔离级别

1.读未提交:即无隔离级别,脏读、不可重复读、幻读均会出现2.读已提交:不可重复读、幻读会出现3.可重复读:幻读(mysql可解决,也是mysql默认使用的隔离级别)4.串行化

mysql索引构成

索引类型分类:B+树和HashB+树:所有叶子节点高度不超过1;内容全部存储在叶子节点上,并且叶子结点可以有兄弟关系的指针连接起来叶子节点的内容,方便范围,begin和in类型的查询Hash:借助内容的Hash值做桶分析;并解决优化Hash冲突的问题,等值查询时有优势

索引形态分类

1.聚簇索引:索引存放内容包含数据,访问效率相对较高;至多只能有一个2.非聚簇索引:索引存放数据指针,数据另外存储;可以有很多,不建议太多,每次update,insert都会调整B+树的结构

Mysql索引优化

优化原则1.经常被查询的区分度高的列做索引;建议控制在20-40%的区分度2.最左原则,索引从左边开始匹配;or查询时建议使用union去使用索引;3.回盘排序,注意避免,将排序列按照顺序建立对应的联合索引;4.覆盖索引,查询只包含索引的字段时,能避免费聚簇索引,查询效率更高,如索引列是A,B那么selectA,Bfrom时效率更高;5.小表驱动大表;

索引调优explain

1.system:仅一行2.const::主键or唯一键的等值查询3.eq_ref:主键or唯一键的扫描或关联查询即带了范围4.ref:非唯一索引的常量等值查询5.range:索引的范围查询6.index:索引全查询7.all:遍历表查询优化到至少range范围




转载请注明:http://www.aierlanlan.com/grrz/8327.html