面试题答案
一键面试1. 索引设计与调整
- B - Tree索引:
- 适用场景:对于范围查询(如
WHERE column BETWEEN value1 AND value2
)、排序查询(如ORDER BY column
)非常有效。在多列关联查询中,如果经常按照某些列的顺序进行条件筛选和排序,适合使用B - Tree索引。 - 设计原则:
- 最左前缀原则:如果查询条件是
WHERE col1 = value1 AND col2 = value2 AND col3 = value3
,创建复合索引(col1, col2, col3)
能充分利用索引。因为B - Tree索引在查找时会从左到右依次匹配条件,只有前面的列匹配上,后面的列才能利用索引优势。 - 选择性高的列优先:选择性是指某列不同值的数量与总行数的比例。选择性越高,索引的效率越高。例如,性别列(只有男、女两个值)选择性低,而身份证号列选择性高。在设计复合索引时,应将选择性高的列放在前面。
- 最左前缀原则:如果查询条件是
- 适用场景:对于范围查询(如
- 哈希索引:
- 适用场景:哈希索引适用于等值查询(如
WHERE column = value
),能快速定位到数据。对于表中经常进行等值判断的列,可以考虑使用哈希索引。 - 局限性:哈希索引不支持范围查询和排序操作,因为哈希值是无序的。所以在使用哈希索引时,要确保查询主要是等值查询场景。
- 适用场景:哈希索引适用于等值查询(如
2. 查询计划分析与优化
- 查看查询计划:在MariaDB中,可以使用
EXPLAIN
关键字来查看查询计划。例如:EXPLAIN SELECT * FROM your_table WHERE condition;
。查询计划会展示查询执行的步骤,包括表的连接顺序、使用的索引等信息。 - 常见问题及优化:
- 全表扫描:如果查询计划显示是全表扫描(
type
为ALL
),说明没有使用到合适的索引。需要根据前面提到的索引设计原则,创建或调整索引。 - 索引选择不当:有时查询计划可能选择了一个低效的索引。可以通过强制使用索引(如
SELECT * FROM your_table FORCE INDEX (index_name) WHERE condition;
)来验证是否能提高查询效率。如果强制使用索引后性能提升,说明原来的索引选择有问题,需要进一步优化索引设计。 - 连接类型优化:在多表关联查询中,连接类型(如
INNER JOIN
、LEFT JOIN
等)会影响查询效率。确保使用正确的连接类型,并且在连接条件上创建合适的索引,以减少数据的笛卡尔积运算。
- 全表扫描:如果查询计划显示是全表扫描(
3. 其他优化手段
- 分区表:对于百万条记录的大表,可以考虑使用分区表。根据某些列(如时间列)将表分成多个分区,查询时只需要扫描相关的分区,减少扫描的数据量。例如按月份对订单表进行分区,查询某个月的订单时,只扫描对应的分区。
- 覆盖索引:如果查询中涉及的列都包含在索引中,那么查询可以直接从索引中获取数据,而不需要回表操作。例如,查询
SELECT col1, col2 FROM your_table WHERE col3 = value
,如果创建索引(col3, col1, col2)
,就可以利用覆盖索引,提高查询效率。