在MySQL中选择合适的索引列顺序,关键在于理解查询模式和数据分布。索引列的顺序直接影响查询性能,不合理的顺序可能导致索引失效或效率低下。
考虑查询中最常使用的列
将查询条件中出现频率最高的列放在索引的前面。这样可以尽早缩小扫描范围。
如果大多数查询都通过user_id过滤,应将其作为联合索引的第一列 例如:WHERE user_id = 123 AND status = 'active',优先以user_id开头建索引遵循最左前缀匹配原则
MySQL使用索引时必须从最左列开始,中间不能跳过。设计时要确保常用查询能用上最左前缀。
索引(a, b, c)能支持WHERE a=1、WHERE a=1 AND b=2,但不支持WHERE b=2 避免把低选择性的列放在前面,比如gender这种只有男女的字段兼顾排序和覆盖索引需求
如果查询包含ORDER BY或GROUP BY,尽量让索引同时满足过滤和排序,减少额外排序操作。
对于WHERE user_id = 123 ORDER BY created_time,使用(user_id, created_time)索引可避免文件排序 若索引包含了查询所需的所有字段,称为覆盖索引,可直接从索引获取数据,提升性能评估列的选择性
选择性高的列(即唯一值多的列)更适合放在前面,能更快缩小结果集。
比如email通常比city有更高的选择性 可通过SELECT COUNT(DISTINCT col)/COUNT(*) FROM table估算选择性基本上就这些。结合实际查询语句分析执行计划(EXPLAIN),不断调整索引顺序,才能找到最优方案。不复杂但容易忽略细节。
