1. mysql只是update加锁么?
UPDATE rent_contacts SET contacts_mobile=‘11111‘ WHERE rent_unit_code in (SELECT rent_unit_code FROM rent_unit );
第一种情况: 条件无索引
sql一执行:
BEGIN;
UPDATE contacts SET mobile=‘11111‘ WHERE code in (‘3424342‘ );
sql二执行 UPDATE contacts SET mobile=‘11111‘ WHERE code in (‘1111‘ );
sql二执行受阻,sql一commit之后,sql二可执行成功
结论:条件无索引,锁表
第二种情况: 条件有索引,in语句是确定的值
sql一执行:
BEGIN;
UPDATE contacts SET mobile=‘11111‘ WHERE code in (‘3424342‘ );
sql二执行 UPDATE contacts SET mobile=‘11111‘ WHERE code in (‘1111‘ );
sql二正常执行,sql二不依赖sql一的commit
结论:条件有索引,锁行
第三种情况: 条件有索引,in语句是复杂查询
sql一执行:
BEGIN;
UPDATE contacts SET mobile=‘11111‘ WHERE code in ( select code from user where id=1);
sql二执行 UPDATE contacts SET mobile=‘11111‘ WHERE code in (‘1111‘ );
sql二执行受阻,sql一commit,sql二正常执行
结论:条件有索引,in语句是不确定的值,锁表
2. mysql*享锁(读锁)和排他锁(写锁)
在B字段的索引数据也是有序的情况下才能使用复合索引,什么时候才是有序的呢?观察可知,当然是在name字段是等值匹配的情况下,B才是有序的。这也就是mysql索引规则中要求复合索引要想使用第二个索引,必须先使用第一个索引的原因。
4. mysql查看有没有走索引
用expalin关键字查出来的结果,type字段包含有index和ref.
对表访问方式(type),表示MySQL在表中找到所需行的方式,又称“访问类型”。
常用的类型有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)
ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行
index: Full Index Scan,index与ALL区别为index类型只遍历索引树
range:只检索给定范围的行,使用一个索引来选择行
ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system
NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。