explain select * from tb_user where profession = '软件工程' and age = 31 and status= '0';
explain select * from tb_user where profession = '软件工程' and age = 31;
explain select * from tb_user where profession = '软件工程';
# 但当我们中间省略一列,或者缺少最前面的列,后面的索引列将不再被使用
explain select * from tb_user where age = 31 and status = '0';
explain select * from tb_user where status = '0';
复制代码
注意:
where后的索引顺序不受约束,最前面的索引可以放在where的任意位置不受影响
范围查询
在联合索引中,不允许出现(>, 30 and status = '0';# 但我们使用 = 则不受影响explain select * from tb_user where profession = '软件工程' and age >= 30 and status = '0';[/code]索引失效注意点
针对于索引失效的常见情况共有五种:
索引列运算
我们不能在索引列上继续运算,否则索引失效
# 我们如果使用 <,> 后面的索引将不再生效
explain select * from tb_user where profession = '软件工程' and age > 30 and status = '0';
# 但我们使用 <=,>= 则不受影响
explain select * from tb_user where profession = '软件工程' and age >= 30 and status = '0';
复制代码
字符串未加引号
字符串类型字段使用时,不加引号,索引将失效
# 如果我们采用substring等操作,索引列将失效
explain select * from tb_user where substring(phone,10,2) = '15';
复制代码
模糊查询
索引中禁止头部出现模糊查询
# 这里最后一部分status的0未加引号,数据仍旧可以输出,但不再通过索引查询
explain select * from tb_user where profession = '软件工程' and age = 31 and status= 0;
下面我们给出不同SQL语句相对应的行锁级别:
SQL行锁类型说明INSERT排他锁自动加锁UPDATE排他锁自动加锁DELETE排他锁自动加锁SELECT不加锁SELECT ... LOCK IN SHARE MOOE共享锁需要手动在SELECT之后加LOCK IN SHARE MODESELECT ... FOR UPDATE排他锁需要手动在SELECT之后加FOR UPDATE行锁特点: