mysql面试必看篇
1、B树和B+树之间的区别是什么?
共同点是都是多叉树。
区别是
- b树每个节点存的是键值和指向子节点的指针所以节点包含了数据和索引;b+树叶子节点才会存储健值和数据,内部节点只包含子节点的指针,而叶子节点的下层才会存储数据本身,通过指针链接成一个有序列表。
- b+树的叶子节点形成有序链表,所以更适合于范围查询和顺序查询,只需要遍历叶子节点的有序链表即可;而b树数据分布在各个节点中,范围查询和顺序查询需要遍历多个节点。
- B+树插入和删除只需要修改叶子节点,不用改变内部节点减低维护复杂度和操作开支;b树插入删除中可能会调整内部节点结构,因为数据分布在各个节点之间。
2、Innodb中的B+树是怎么产生的?
当在innodb的表创建一个索引的时候,innodb会自动创建一个b+树结构。通过create index或者 alter table 语句来创建;新插入键值或者更新现有的键值对时,如果满了则进行分页,如果数据键值减少则合并;在插入和删除的时候会进行平衡调整,保证效率;
3、高度为3的B+树能存多少条数据?
B+树的高度和存储数据的关系取决于索引大小、数据页大小等因素;
mysql中b+树每个节点就是一个数据页,默认时16KB,非叶子节点存索引值和偏移量,而叶子节点存的时每行的记录;假设一行数据时1K,理论上一页存16条,主键为bigint,长度为8字节,指针为6字节,则16K/(8+4)=1170指针,一个指针一个页,则2高度就可以放117016=18720 ,高度为3可以发11701170*16=2190w条;所以理论上24层就可以存千万数据,基于主键查询数据,最多需要24次磁盘IO。
4、Innodb是如何支持范围查找能走索引的?
因为Innodb 用的是b+树索引结构来组织数据;主键数据是有序存放的,对于非主键索引页可以通过一些辅助索引进行范围查询;
5、为什么要遵守最左前缀原则才能利用到索引?
因为索引的设计中,规定了最左原则可以确保能够有效地使用索引。因为相同数据的前缀索引可能是连续存储的,所以根据前缀更能方便快速定位。
6、范围查找导致索引失效原理分析
- 数据分布不均匀:但是数据数据分布不均匀
- 数据类型不匹配:比如类型转换操作,会失效
- 索引使用选择不当:可能存在多个索引,但是数据库优化器选择了不适合的索引导致无效索引;
7、覆盖索引的底层原理
覆盖索引是指只需要索引就可以完成查询,而不需要查询实际数据行,这只需要直接到索引中获取所需要的数据,而不需要额外的表查询;
因为数据库用了b+树或者类似的数据结构来组织索引。这时候索引叶子节点保安表中数据数据值本身和数据行的引用;
8、索引扫描底层原理
innodb的b+树结构,叶子节点存储实际的索引数据,叶子节点下一层才会存储数据,非叶子节点可以找到叶子节点。
- 当执行查询时,数据库引擎会根据查询条件从根节点开始遍历 B+ 树索引。
- 如果查询条件中包含了索引的前缀,数据库引擎将沿着 B+ 树的路径向下遍历,直到找到叶子节点。
- 在叶子节点上,数据库引擎执行特定的查找操作,如等值查找、范围查找等,以找到满足查询条件的索引条目。
- 如果索引可以覆盖查询所需的所有列,那么数据库引擎可以直接从索引中获取数据,而无需访问实际的数据行,从而实现覆盖索引扫描。
- 如果索引不能覆盖所有需要的列,数据库引擎将使用找到的索引条目的引用来定位实际的数据行,并获取额外的列数据,这称为回表操作。
9、orderby为什么会导致索引失效?
- 排序数据不符合索引顺序:比如索引是按A,B列排序,而要求排序B时;
- 排序顺序和索引顺序相反
- 查询的列不在索引范围内
- 使用了函数方法再进行排名
10、mysql中的数据类型转换有哪些要注意的?
- 数据丢失:大类型转成小类型
- 舍入误差:双精度变单精度
- 日期和时间转换:考虑时差和不同类型
11、对字段进行操作导致索引失效原理
- 类型不匹配
- 进行隐式类型转换
- 索引长度超过限制
- 列顺序不匹配
12,大表如何优化?
- 设置合理的数据类型,根据业务设置适合的索引,减少不必要的索引;
- 对表进行分表,根据时间或者业务进行水平或者垂直分表;
- 定期去维护和优化;
- 优化高效的查询语句,频繁查询但是又不常变化的数据进行缓存起来;
13、分库分表之后,id 主键如何处理?
- 使用一些唯一的主键比如UUID,或者雪花算法生产主键
- 使用分布式主键生成器
- 更具特定规则生产主键
14、说说在 MySQL中一条查询 SQL是如何执行的?
- 连接mysql服务器(连接到数据库,进行身份验证)
- 解析sql语句(进行语法和语义分析)
- 查询缓存(可选择)
- 优化执行器
- 执行查询
- 放回结果
- 关闭连接
15、索引有什么优缺点?
优点
- 提高查询速度
- 提高排序速度
- 通过唯一索引,确保某列的唯一性
缺点
- 占用空间,过多不必要的索引造成空间浪费
- 降低写操作的性能
- 增加维护成本
16、MySQL中varchar与char的区别?
存储方式不同,char会固定存储长度,长度不够会在末尾添加空格。warchar会动态分配,不会自动填充;注意:如果需要固定长度就用 char,比如身份证字段;
17、varchar(30) 中的30代表的涵义?int(11) 中的 11 代表什么涵义?
- varchar(30) :表示长度为30可变长的字符串(utf-8 是多字节,所以,存储字节数会大于30);
- int(11) :显示长度,并不是存储长度;
18、为什么 SELECT COUNT(*)FROM table 在InnoDB 比MyISAM 慢?
- mylsam有一个计数器,可以计算表的行数。
- innodb存储支持事务和行级锁,会有额外开销。
19、 Select count(*) Select count(1) Select count(字段) 的区别
- COUNT(1):表示主键数(包括对NULL的统计)
- COUNT(*):官方推荐(包括对NULL的统计)
- COUNT(字段):列表数,不包含不为空的
所以count(*)~count(1) >count(字段)
20、DOUBLE和DECIMAL
declmal有更高的精度,还要预留空间存正负值;double可能会失精度,范围更广,浮点数存储所以更省空间;
21、mylsam和innodb 区别
- innodb支持事务
- mylsam支持表级锁,innodb是行级锁
- myslam支持全文检索,innodb不支持(5.6之后才支持)
- 文本查询较多更新较少的简单表用mylsam,更新多,索引负责的用innodb
22、什么时候不用索引
- 小表
- 频繁更新的表
- 相同较多的
- 经常需要全表查询的
23、mysql事务隔离级别
- 读未提交(最低级的隔离级别):允许事务读取其他事务尚未提交的数据;容易读到未提交的数据,导致脏读。
- 读已提交(不可重复读):允许只读取已经提交的数据;解决脏读,但是在同一个事务的多次查询中,可以其他事务不断提交新的数据,导致读到结果不一致,造成不可重复读的问题。
- 可重复读(默认):在开始事务时,对读取数据进行快照并加行锁,保证事务读到同一个结果;解决了不可重复读,但是同一事务多次执行相同的查询结果却读不到新插入合适的数据,结果不一致造成幻读;
- 串行化:使用排他锁,对执行数据进行锁定,让事务按照提交的顺序依次执行,同一时间只允许一个事务执行,最后强制事务之间完全隔离,只有事务提交后才对外可见。(缺点:会导致性能下降。)
24、mvcc是什么(类似乐观锁)?
mvcc是多版本并发控制,是一种无锁的事务机制,用于多个事务同时访问相同数据时保证事务的隔离性和并发性。核心思想是为每个事务创建一个数据库(快照),然后在事务执行期间保持数据的一致性,同时允许事务并发读取和修改数据;
- 在事务生成唯一的一个时间戳或者版本号,事务执行期间只能看到之前提交的版本号
- 事务根据同一个版本号来确保数据一致性
- 执行事务途中对条件进行快照,但是是不加锁的可以允许其他事务进行修改,但是可以保证现在的事务看到的数据是一致的,避免幻读;