sql相关知识点(一):数据库的值大小写问题,for update,索引失效讲解

  1. MySql 数据库的值不区分大小写,Oracle的值区分,解决办法binary关键字
select DISTINCT BINARY(name)
from student

在这里插入图片描述
2. union和 union all 区分 union 会去掉交集,union all 不会

3 select … for update总结:(写的很好https://www.cnblogs.com/wangshiwen/p/9837408.html)

取到数据的时候,mysql不进行锁 (no lock)
获取到数据的时候,进行对约束字段进行判断,存在有索引的字段则进行row lock
否则进行 table lock
注意
当使用 ‘<>’,‘like’等关键字时,进行for update操作时,mysql进行的是table lock
网上其他博客说是因为主键不明确造成的,其实并非如此;
mysql进行row lock还是table lock只取决于是否能使用索引,而 使用’<>’,'like’等操作时,索引会失效,自然进行的是table lock;

4什么情况索引会失效:

1.负向条件查询不能使用索引

负向条件有:!=、<>、not in、not exists、not like 等。

2.索引列不允许为null

单列索引不存null值,复合索引不存全为null的值,如果列允许为 null,可能会得到不符合预期的结果集。

3.避免使用or来连接条件

应该尽量避免在 where 子句中使用 or 来连接条件,因为这会导致索引失效而进行全表扫描,虽然新版的MySQL能够命中索引,但查询优化耗费的 CPU比in多。

4.模糊查询

前导模糊查询不能使用索引,非前导查询可以。

以上情况索引都会失效,所以进行for update的时候,会进行table lock

参考:https://juejin.im/post/5b14e0fd6fb9a01e8c5fc663
再思考
为什么存在索引,mysql进行row lock,不存在索引,mysql进行table lock?
这是存储引擎InnoDB特性决定的:
InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!
再总结
在上述例子中 ,我们使用给name字段加索引的方法,使表锁降级为行锁,不幸的是这种方法只针对 属性值重复率低 的情况。当属性值重复率很高的时候,索引就变得低效,MySQL 也具有自动优化 SQL 的功能。低效的索引将被忽略。就会使用表锁了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值