MySQL面试
何为索引?有什么作用?
索引是数据库中用于提高查询效率的一种数据结构,本质上是一种有序的数据结构,用来加快数据的查找速度。
索引的主要作用是:
- 提高查询效率
- 加快排序和分组操作
- 减少磁盘 IO 次数
缺点是占用额外存储空间,增删改会变慢(因为要维护索引)
索引的类型有哪些
主键索引:唯一标识表中每一行数据,值必须唯一且非空。每个表只能有一个主键索
唯一索引:保证索引列的值唯一,但允许空值。适用于需要避免重复数据的场景。
普通索引:最基本的索引类型,没有任何限制,适用于一般查询。
组合索引:在多个列上创建的联合索引,遵循最左前缀原则,适合多条件查询。
全文索引:用于文本内容的搜索,支持关键词匹配和自然语言查询。
聚簇索引:数据的物理存储顺序与索引顺序一致,适合范围查询和主键访问。
非聚簇索引:索引和数据分开存储,索引存储的是数据的指针,适合辅助查询。
覆盖索引:索引包含查询所需的所有字段,避免回表操作,显著提升查询性能。
全局索引:跨分区表的索引,适用于分布式数据库,保证全局唯一性。
MySQL 索引底层是什么?
InnoDB 存储引擎使用 B+ 树作为索引结构。
为什么用 B+树,不用红黑树?
MySQL 采用 B+ 树作为索引,因为它支持高效的范围查询、顺序访问和磁盘读写优化。B+ 树的叶子节点链表结构支持顺序访问和范围查询,树的高度较低,减少了磁盘 I/O 次数,适合处理大规模数据集,且能够有效支持等值查询和范围查询。
主键索引和普通索引区别?
主键索引是唯一索引,不允许重复;普通索引允许重复。
更专业的回答是:InnoDB 的主键索引是聚簇索引^1,数据和索引存储在一起;普通索引是二级索引。
SQL 调优
SQL调优的思路:
SQL调优的核心是减少数据扫描量、减少IO次数、提高查询效率。首先要定位慢SQL,然后分析执行计划,找出瓶颈,最后针对性优化。
定位慢SQL:
开启慢查询日志,设置阈值比如2秒,记录执行时间超过阈值的SQL。通过日志找出需要优化的SQL语句。也可以通过监控系统实时发现慢查询。
分析执行计划:
使用explain命令分析SQL的执行计划。重点关注几个字段:type表示访问类型,最好是ref或range,避免ALL全表扫描。key表示使用的索引,如果是NULL说明没用索引。rows表示扫描行数,越少越好。Extra显示额外信息,要避免Using filesort和Using temporary。
优化方向:
第一是添加索引。根据where条件、order by、group by的字段添加合适的索引。使用联合索引时注意最左前缀原则。使用覆盖索引避免回表查询。
第二是避免索引失效。不要在索引列上使用函数或表达式。避免隐式类型转换。like查询不要以通配符开头。or条件要确保两边都有索引。
第三是优化SQL语句。避免select星号,只查询需要的字段。减少子查询,改用join。但join的表不要太多,一般不超过3个。分页查询使用延迟关联优化。
第四是优化表结构。选择合适的数据类型,能用int不用varchar。字段设置not null,避免null值判断。大字段独立存储,不要和常用字段放一起。
第五是分库分表。数据量大时,单表查询再怎么优化也有瓶颈。可以按照用户ID、时间等维度分表,把数据分散到多个表中。
第六是使用缓存。热点数据放到Redis缓存,减少数据库查询。查询结果缓存起来,设置合理的过期时间。
