索引部分
MySQL的索引有了解?
InnoDB存储索引的底层实现数据结构是B+树
为什么底层数据结构使用B+树,而不是B树?
- B+树存储查询效率更稳定。在B+树种,所有非叶子节点存储用来存储索引,叶子节点用来存储数据。而B+的非叶子节点也会保存数据。
- B+树的磁盘读写代价更低。B+树中没有指向关键字具体信息的索引,因此B+树内部结点相当于B树更小,同样空间可以读入更多的节点。
SQL的范式?
第一范式:字段不可再分,属性是原子的。
第二范式:在第一范式的基础上,属性完全依赖于主键
第三范式::非主键字段不能相互依赖
聚集索引和非聚集索引有了解么?
聚集索引,也成主键索引。其索引树的叶子节点中存储的是整行的数据
非聚集索引,也成普通索引。索引树的叶子节点中存储的是主键的值
create table User( id int primary key, uid int not null, name varchar(16), index(uid) )engine=InnoDB;
MySQL回表:
如果语句是
Select * from User where id=3
,即主键查询方式,只需要搜索主键搜索树
如果语句是
Select * from User where uid=23
,即采用普通索引搜索方式,需要先搜索普通索引树,得到其对应的主键值是3,再到主键索引树搜索一次,这个过程称之为回表索引覆盖:如果在普通索引树上的查询已经直接提供了结果,不需要回表操作,这样的普通索引叫做覆盖索引。覆盖索引的使用可以显著提高查询效率,是常见的MySQL性能优化手段。
select uid from User where gid=2 order by create_time asc limit 10;
索引最左前缀原则:在联合索引的情况下,不需要索引的全部定义,只要满足最左前缀,就可以利用索引来加速查询速度。这个最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。
索引下推:MySQL5.6引入的索引下推优化,(联合索引前提)可以在索引遍历过程中,对索引中包含的其余字段先做判断,直接过滤掉不满足条件的记录,减少回表次数,提升查询效率。
MySQL常见的存储引擎(InnoDB和MyISAM的区别)?
- MyISAM不支持事务;InnoDB是事务类型的存储引擎
- MyISAM只支持表级锁;InNoDB支持行级锁和表级锁,默认为行级锁。
- MyISAM引擎不支持外键;InnoDB支持外键
- 对于count(*)查询来说,MyISAM更具有优势,因为其保存了行数
- InNoDB是为处理巨大数据量时的最大性能设计的存储引擎
- MyISAM支持全文索引,InnoDB不支持.
注意:从MySQL 5.6之后,InnoDB也支持全文索引,感谢评论区一楼老哥的斧正,感谢~
MySQL中的锁机制?
- 独占锁(排它锁),也成X锁(Exclusive Lock):独占锁锁定的资源只允许进行锁定操作的程序使用,其他任何对它的操作均不会被接受。执行数据更新命令:即
Insert、UPDATE或Delete
命令时,MySQL会自动使用独占锁,但当对象上有其它锁存在时,无法对其加独占锁,独占锁一直到事物结束才能被释放。 - 共享锁,也叫S锁(Share Lock):那就是锁定的资源可以被其他用户读取,但其他用户不能修改,如果select查询语句要手动加人共享锁。那么对应的SQL语句:
Select ... lock in share mode
- 独占锁(排它锁),也成X锁(Exclusive Lock):独占锁锁定的资源只允许进行锁定操作的程序使用,其他任何对它的操作均不会被接受。执行数据更新命令:即
悲观锁和乐观锁:
- 悲观锁:利用数据库的锁机制实现,在整个数据处理过程中都加入锁,以保持排他性。
- 乐观锁:乐观锁可以用CAS实现,在操作数据的时候进行一次比较,按照当前事务中的数据和数据库中的该数据是否一致来决定是否要执行本次操作。
乐观锁ABA问题的解决?
可以通过基于数据版本(Version)记录机制来解决。