索引部分
-
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中的锁机制?
- 独占锁(排它锁),也成X锁(Exclusive Lock):独占锁锁定的资源只允许进行锁定操作的程序使用,其他任何对它的操作均不会被接受。执行数据更新命令:即
Insert、UPDATE或Delete
命令时,MySQL会自动使用独占锁,但当对象上有其它锁存在时,无法对其加独占锁,独占锁一直到事物结束才能被释放。 - 共享锁,也叫S锁(Share Lock):那就是锁定的资源可以被其他用户读取,但其他用户不能修改,如果select查询语句要手动加人共享锁。那么对应的SQL语句:
Select ... lock in share mode
- 独占锁(排它锁),也成X锁(Exclusive Lock):独占锁锁定的资源只允许进行锁定操作的程序使用,其他任何对它的操作均不会被接受。执行数据更新命令:即
-
悲观锁和乐观锁:
- 悲观锁:利用数据库的锁机制实现,在整个数据处理过程中都加入锁,以保持排他性。
- 乐观锁:乐观锁可以用CAS实现,在操作数据的时候进行一次比较,按照当前事务中的数据和数据库中的该数据是否一致来决定是否要执行本次操作。
-
乐观锁ABA问题的解决?
可以通过基于数据版本(Version)记录机制来解决。
-
什么是事务?
事务,即数据库库事务,由一个有限的数据库操作序列组成
通常情况下,事务的正确执行会使数据库从一种状态到另一种状态。
-
事务的特性?
- 原子性:即不可分割,事务要么全部执行,要么都不执行
- 一致性:事务的执行从一种正确状态到另一种正确状态
- 隔离性:在事务正确提交之前,不允许把事务对该数据的改变提供给任何其他事物
- 持久性:事务正确提交后,其结果将永远保存在数据库中。
-
并发状态下事务产生的问题:
- 脏读:针对未提交的数据
- 不可重复读:在一个事务里面读取了两次数据,读出来的数据不一致,针对修改操作
- 幻读:在一个事务里面的操作中发现了未被操作的数据,针对增删操作。即在事务 A 多次读取数据集的过程中中,事务 B 对数据进行了新增操作或者删除操作,导致事务 A 多次读取的数据集不一致。
-
四种隔离级别?
-
Read_Uncommitted:读未提交,即能够读取到没有被提交的数据。
-
Read_Committed:读已提交,即能够读取到那些已经提交的数据,能够防止脏读,但是无法解读不可重复读和幻读的问题
-
Repeatable_Read:重复读取,即在数据读出来之后加锁,类似于*Select * from table for update * 明确数据读出就是为了更新用的,所以要加一把锁,防止别人修改它。Repeatable_Read的意思类似,读取一条数据,这个事务不结束,别的事务就不可以改这条数据。但幻读还是无法解决
-
Serializable:串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才能执行另一个事务里的所有子事务,这样就解决了脏读、不可重复读和幻读。
-