面试题答案
一键面试索引结构对性能的影响
- 查询效率提升:B+树索引的有序性使得范围查询能够利用索引快速定位到起始和结束位置,减少全表扫描。比如在一个按时间排序的B+树索引上执行时间范围查询,能迅速定位到起始时间和结束时间对应的记录位置,按顺序读取数据。
- 数据读取连续性:B+树叶子节点通过链表相连,范围查询时可以顺序读取相邻节点的数据,这对于I/O操作友好,提升数据读取效率。
可能出现的性能瓶颈
- 索引层级深:如果数据量非常大,B+树索引层级会增加,导致查询时需要多次磁盘I/O来遍历索引节点,降低查询性能。
- 索引选择性差:若索引列的重复值较多,索引的过滤效果不佳,范围查询可能需要扫描大量不必要的数据。例如性别列作为索引,重复值过多,范围查询时不能有效过滤。
- 回表操作开销:如果查询的列不在索引中,使用索引定位数据后还需回表获取完整数据行,多次回表操作会增加I/O开销。
优化策略
索引设计
- 覆盖索引:设计索引时尽量包含查询所需的所有列,避免回表操作。例如查询
SELECT column1, column2, column3 FROM table WHERE column1 BETWEEN value1 AND value2
,可创建复合索引CREATE INDEX idx_column1_column2_column3 ON table(column1, column2, column3)
。 - 前缀索引:对于长字符串列,使用前缀索引能减少索引空间,提升索引效率。如对一个长文本列
text_column
,可创建CREATE INDEX idx_text_column ON table(text_column(10))
,10为前缀长度,根据实际情况调整。 - 索引重建与优化:定期重建索引,减少索引碎片,提升索引性能。可使用
ALTER TABLE table_name REBUILD INDEX index_name
。
查询语句改写
- 避免函数操作:避免在索引列上使用函数,因为这会使索引失效。如
WHERE UPPER(column) BETWEEN UPPER(value1) AND UPPER(value2)
应改写为WHERE column BETWEEN value1 AND value2
。 - 拆分范围查询:对于范围跨度大的查询,可拆分为多个小范围查询。例如查询时间跨度一年的数据,可按月拆分查询,减少单次查询的数据量。