
聚集索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。 叶子结点存储索引和行记录,聚簇索引查询会很快,因为可以直接定位到行记录。
非聚集索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。 叶子节点存储聚簇索引值(主键id),需要扫码两遍索引树,先通过普通索引定位到主键值id,再通过聚集索引定位到行记录。
回表查询可以理解为普通索引的查询,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。
索引覆盖,即将查询sql中的字段添加到联合索引里面,只要保证查询语句里面的字段都在索引文件中,就无需进行回表查询;
实际开发中,不可能把所有字段建立到联合索引,可根据实际业务场景,把经常需要查询的字段建立到联合索引中。
在Mysql5.6的版本上推出,用于优化查询。 在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
优化超多分页场景。 查询条件放到子查询中,子查询只查主键id,然后使用子查询中确定的主键关联查询其他的属性字段。
MYSQL的锁1. 共享锁,也就是读锁,可以通过select ... lock in share mode强制加锁,默认select语句是不加锁的
2. 排他锁,也就是写锁,可以通过select ... for update强制加写锁,默认情况下insert, update, delete语句加写锁
MYSQL锁的粒度
1. 行锁,锁一行,并发高(因为冲突少),开销小,会产生死锁,innodb引擎
2. 表锁,锁全表,并发低(因为冲突多),开销大,不会产生死锁,myisam, memory引擎,所以myisam没有事务,也是不会数据库死锁的,在执行SQL前做一次锁定好所需资源,但是myisam可能会因为大量的表级别的写锁导致无法获取到读锁从而对读阻塞
3. 页锁,对杭锁和表锁的一种折中,锁一批相邻的记录,在并发和开销上介于行级锁和表锁中间,也会产生死锁,bdb数据库
Innodb存储引擎
由于Innodb有MVCC,所以select ...的时候是不加锁的,直接读最新版本的数据
select语句强制指定锁的时候回加锁,还有就是insert, update, delete的时候要加锁
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)