MySQL 面试题解析
本资源摘要信息将涵盖 MySQL 面试题的相关知识点,包括数据库查询效率优化、索引建立、幻读问题解决、B+ 树数据结构、锁机制、聚簇索引和非聚簇索引的区别等。
**数据库查询效率优化**
数据库查询效率很低可能是由于缺乏索引、表结构不合理、查询语句不优化等原因导致的。解决方法包括:
* 对查询中经常访问到的数据加索引
* 使用 EXPLAIN 命令查看查询语句的执行计划,然后进行优化
* 尽可能避免使用子查询,使用合适的 JOIN 语句等,减少查询时间
* 对于大量数据的查询,可以使用分页查询,避免一次性查询大量数据导致效率过低
* 对于需要复杂计算的查询,可以考虑使用数据库缓存,将计算结果缓存到内存中,避免重复计算
* 对于高并发的查询,可以考虑使用数据库的读写分离、分库分表等技术,以提高数据库的并发处理能力
**索引建立**
索引是 MySQL 中提高查询效率的重要手段。建立索引需要考虑到最左匹配原则,避免索引失效。例如,在 WHERE a > 1 and b = 1 ORDER BY c 中,不能把 a 作为联合索引第一个,因为最左匹配原则是在前一个有序的情况下,才能走到后面的索引查询,而这里不确定 a到底是 2 还是 3 还是什么,会导致索引失效。如果 c 建立索引也会导致索引失效,因为有 orderby 函数。所以选择 (b, a) 建立索引。
**幻读问题解决**
读提交是指一个事务只有提交,另一个事务才能读取这个事务提交后的数据。不可能发生脏读,可能发生不可重复读和幻读。解决方式包括:
* 使用行级锁或者表级锁可以锁定某一行或某张表的记录,使用行级锁,可以避免锁住不必要锁住的数据,提高并发性能。使用表级锁可以避免幻读问题
* MVCC 是多版本并发控制,可以通过维护版本链,解决并发条件下的读一致性问题
**B+ 树数据结构**
B+ 树是 MySQL 默认的存储引擎 InnoDB 的索引数据结构,并发修改需要考虑到锁的结构来保证并发修改的正确性和一致性,还需要考虑到锁的粒度来控制开销。锁的结构有表级锁和行级锁,行级锁的粒度较小,可以避免不必要的开销,比如只需要锁住需要修改的数据行,而其他数据行可以被其他事务。
**聚簇索引和非聚簇索引的区别**
聚簇索引又叫主键索引,叶子节点中存储主键和数据,非聚簇索引中存储索引和主键。聚簇索引中主键索引和数据在一起,都在叶子节点中,非聚簇索引中,索引和数据是分开的。建立在主键上的是主键索引。我们自己建的索引基本上都是非聚簇索引。在非聚簇索引中查询数据,还需要根据主键到聚簇索引中查询,这个过程叫做回表。第一次索引查询是顺序 IO,回表是随机 IO,消耗性能,回表次数越多,优化器越倾向于全表扫描。
**其他知识点**
* COUNT(1)、COUNT(*)、COUNT(主键)、COUNT(字段) 的比较效率
* B+ 树可以并发修改的原因
* 数据库读写分离、分库分表的应用场景