面试题答案
一键面试前缀索引设计方案
- 确定前缀长度:
- 对于非常大的
TEXT
类型列,不能直接对整个列创建索引,因为索引存储开销大且性能低。需要选择合适的前缀长度。一种常见的方法是通过分析数据来确定。 - 可以使用以下SQL查询,查看
log_message
列前n
个字符的重复率。例如,假设n = 10
:
SELECT COUNT(DISTINCT LEFT(log_message, 10)) / COUNT(*) AS distinct_ratio FROM logs;
- 不断调整
n
的值,直到distinct_ratio
达到一个合适的值,比如0.8 - 0.95之间。这个n
值就是合适的前缀长度。
- 对于非常大的
- 创建前缀索引:
- 在MySQL中,可以使用以下语句创建前缀索引:
例如,如果确定前缀长度为10,则:ALTER TABLE logs ADD INDEX idx_log_message (log_message(前缀长度));
ALTER TABLE logs ADD INDEX idx_log_message (log_message(10));
- 考虑索引维护成本:
- 前缀索引长度越短,维护成本越低。因为较短的前缀索引占用的存储空间少,插入、更新和删除操作时对索引的修改开销也小。但如果前缀过短,索引的区分度不够,查询性能提升有限。所以需要在查询性能和维护成本之间找到平衡。
- 不同版本MySQL对索引的支持差异:
- 在MySQL 5.6及以上版本,支持对
TEXT
和BLOB
类型列创建前缀索引。而在较旧版本可能不支持或者对前缀长度有更严格的限制。所以在设计索引方案前,要明确所使用的MySQL版本。
- 在MySQL 5.6及以上版本,支持对
使用EXPLAIN
验证索引有效性和优化查询
- 使用
EXPLAIN
查看执行计划:- 对需要优化的查询语句前加上
EXPLAIN
关键字,例如:
EXPLAIN SELECT * FROM logs WHERE log_message LIKE '特定前缀%';
- 对需要优化的查询语句前加上
- 分析
EXPLAIN
结果:id
:标识查询中执行的顺序,通常从1开始,值相同表示按顺序执行。select_type
:常见类型有SIMPLE
(简单查询,不包含子查询或联合查询)、PRIMARY
(最外层查询)等。table
:显示查询涉及的表。partitions
:如果表是分区表,显示查询涉及的分区。type
:表示连接类型,常见的有ALL
(全表扫描)、index
(索引全扫描)、range
(索引范围扫描)等。理想情况下,希望看到range
或更好的连接类型。如果是ALL
,说明未使用索引,查询性能可能较差。possible_keys
:显示可能使用的索引。key
:显示实际使用的索引。如果key
为空,说明没有使用索引。key_len
:显示使用索引的长度。通过这个值可以判断是否使用了预期的前缀索引长度。ref
:显示哪些列或常量与索引进行比较。rows
:估计需要扫描的行数。行数越少,查询性能越好。filtered
:表示存储引擎返回的数据在经过条件过滤后,满足条件的数据所占的百分比。
通过分析EXPLAIN
结果,可以判断索引是否有效使用,并进一步优化查询,例如调整索引前缀长度、优化查询语句等,以提高查询性能。