索引优化需围绕查询模式精准设计:优先覆盖高频高过滤度where条件,避免冗余;复合索引字段顺序须从左到右匹配,等值条件置左、范围条件置右;长字符串可用前缀索引,慎用函数索引。

索引优化不是“建得越多越好”,而是围绕查询模式精准设计:优先覆盖高频、高过滤度的WHERE条件,避免冗余索引,定期清理低效索引。
从查询语句反推索引字段顺序
复合索引的字段顺序直接影响能否命中。MySQL从左到右匹配索引列,中间一旦跳过,后续列就失效。例如,查询 WHERE status = 'paid' AND user_id = 123 AND created_at > '2024-01-01',若建索引 (status, user_id, created_at) 可全用;但若写成 (user_id, status, created_at),当查询只带 status 条件时就无法使用该索引。
- 等值条件(=、IN)字段放最左,且高频等值字段优先
- 范围条件(>、
- ORDER BY 和 GROUP BY 字段可合并进索引末尾,避免额外排序
警惕“伪高效”索引和冗余索引
存在 (a, b) 索引时,再建 (a) 就是冗余;存在 (a, b, c) 时,(a, b) 虽不完全冗余,但在仅查 a 和 b 的场景下已足够,单独建 (a, b) 多数情况没必要。MySQL 8.0+ 支持 SHOW INDEXES FROM table_name 结合 information_schema.statistics 找重复结构。
NetShop软件特点介绍: 1、使用ASP.Net(c#)2.0、多层结构开发 2、前台设计不采用任何.NET内置控件读取数据,完全标签化模板处理,加快读取速度3、安全的数据添加删除读取操作,利用存储过程模式彻底防制SQL注入式攻击4、前台架构DIV+CSS兼容IE6,IE7,FF等,有利于搜索引挚收录5、后台内置强大的功能,整合多家网店系统的功能,加以优化。6、支持三种类型的数据库:Acces
- 用 SELECT * FROM sys.schema_redundant_indexes(需启用 sys schema)快速识别冗余索引
- 删除前用 pt-index-usage 或慢日志分析确认该索引是否真被使用
- 区分“未使用”和“低频使用”——偶尔用于大报表的索引未必该删
合理使用覆盖索引减少回表
当 SELECT 的所有字段都包含在索引中,MySQL 直接从索引获取数据,无需回主键聚簇索引查找行记录,显著降低 I/O。例如用户表常查 SELECT id, name, email WHERE status = 'active',可建索引 (status, id, name, email)。
- 覆盖索引不等于“把所有字段都加进去”,要权衡索引体积与查询收益
- 主键自动包含在二级索引中,所以 (status) 索引其实已能支持 SELECT id WHERE status = ?
- TEXT/BLOB 类型不能建索引,也不应放入覆盖索引,否则索引可能过大失效
注意数据分布与索引选择性
索引效果取决于字段的选择性(distinct 值 / 总行数)。状态字段只有 'draft'/'published'/'deleted' 三个值,选择性极低,单独建索引通常无效;但组合到高频过滤条件中(如 (category_id, status))就可能很有用。
- 用 SELECT COUNT(DISTINCT col)/COUNT(*) FROM table 估算选择性,>5% 可考虑单列索引
- 对长字符串字段,可用前缀索引(如 email(10)),但需确保前缀足够区分大部分值
- 避免对 TIMESTAMP/DATE 类型字段盲目加函数索引(如 WHERE DATE(created_at) = '2024-01-01'),改写为范围查询更高效









