MySQL面试题
B树和B+树的不同
B树每个节点数据项都包含了完整的行数据,他没有冗余索引,所以有可能查询的时候直接在根节点查询出来,所以它的查找不够稳定
B+树完整行数据都存储在叶子节点,其他冗余节点存储的是索引值和子节点(数据页)的最小值的地址,因为冗余节点只存储索引地址,所以数据页大小相同,在同高度的树下,B+树会比B树存储更多的数据,同时在叶子节点之间都有指向前后节点的指针方便处理范围查询。
注:Mysql中B+树一个节点默认是16k
为什么InnoDB表必须建主键,并推荐使用整型自增主键?
因为InnoDB表不建主键的话,MySQL会尝试自己查找一列没有数据重复的列作为键,如果没有则MySQL自己创建一列隐形id作为主键构建聚集索引,而这些操作都是可以避免的。
选择整型是为了便于比较,比如字符型就需要逐个字符比较,自增是为了避免整理数据页的问题,因为一个节点就是一张数据页,如果现在需要插入一个主键id小于当前页最后一条数据id大于倒数第二条数据id的数据,B+树又必须要是排序好的数据结构,所以就需要将最后一条数据修改移动,而自增就可以只需要在这种情况,新增数据页就好了
为什么非主键索引结构叶子节点存储的是主键值?
节省存储空间
为什么没有按索引的最左前列原理使用条件,不会使用索引查询
(name, age, position) select * from tbl where age = 10
因为在构建索引时,要满足排序规则排序,首先是按照name大小排序,name相同按age大小排序,所以排序的时候是按照从左到右的优先级排序的,所以在查询时也是先按name查询,如果没有name条件就没办法使用索引查找了,只能使用全表查找了
什么是数据库的触发器,存储过程,游标?
视图的优缺点
优点:
使用视图,可以简化数据操作。
使用视图,可以定制用户数据,聚焦特定的数据。
使用视图,基表中的数据就有了一定的安全性
缺点:(针对由复杂的多表查询创建的视图)
性能差
修改限制
建立索引的原则
- 针对于数据量较大,且查询比较频繁的表建立索引。
- 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。
- 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
- 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引
- 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。
- 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。
- 单列索引不存储null值,复合索引不存储全为null的值。请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。
为什么要建立联合索引
在查询条件and连接的两个字段 phone、name上都是有单列索引的,但是最终mysql只会选择一个索引,也就是说,只能走一个字段的索引,此时是会回表查询的。
在联合索引中包含 phone、name的信息,在叶子节点下挂的是对应的主键id,如果联合索引的字段包含了查询的字段,那么此时是一个覆盖索引,所以查询是无需回表查询的。即使联合索引不能全部包含查询的字段,也会因为需要回表的数据量小查询的速度快一些
什么是最左前缀法则
如果有联合索引,则要遵守最左前缀法则,也就是查询条件必须从左到右依次是联合索引的字段,如果跳过或者遇到范围查找(>,<,between, like),则后面的字段索引失效
索引失效的情况
- 索引列上进行运算操作, 索引将失效。(例如substring(phone,10,2) = ‘15’)
- 字符串类型字段使用时,不加引号,索引将失效。(隐式类型转换,索引将失效。)
- 如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
- 用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。
- MySQL评估使用索引比全表更慢,则不使用索引(因为索引是用来索引少量数据的,如果通过索引查询返回大批量的数据,则还不 如走全表扫描来的快,此时索引就会失效。)
- 联合索引中,出现范围查询(>,<,between, like),范围查询右侧的列索引失效。
- 单列索引不存储null值,复合索引不存储全为null的值。
MYSQL优化
-
索引优化
-
SQL优化
1、小表驱动大表
2、order by limit形式的语句,让排序的表先查询
3、加索引时参照建立索引的原则
- 表结构优化
1.字段尽量使用not null
2.字段固定长度
3.拆分表
事务的特性
原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性(Consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态
隔离性(Isolation):通常来说,一个事务所做的修改操作在提交事务之前,对于其他事务来说是不可见的。
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。