- MySql 数据库的值不区分大小写,Oracle的值区分,解决办法binary关键字
select DISTINCT BINARY(name)
from student
2. union和 union all 区分 union 会去掉交集,union all 不会
3 select … for update总结:(写的很好)
取到数据的时候,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
参考:
再思考
为什么存在索引,mysql进行row lock,不存在索引,mysql进行table lock?
这是存储引擎InnoDB特性决定的:
InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!
再总结
在上述例子中 ,我们使用给name字段加索引的方法,使表锁降级为行锁,不幸的是这种方法只针对 属性值重复率低 的情况。当属性值重复率很高的时候,索引就变得低效,MySQL 也具有自动优化 SQL 的功能。低效的索引将被忽略。就会使用表锁了。