在MySQL中,以下数据类型或场景不适合建立索引
一、低基数列(重复值多)
典型字段:性别(如ENUM('男','女'))、状态标志(如TINYINT类型的状态码)
原因:
索引筛选效率低:当唯一值比例(Cardinality)过低时,索引需要多次回表查询(随机I/O),性能可能低于全表扫描(顺序I/O)。
优化器可能放弃索引:若筛选比例超过30%,优化器会优先选择全表扫描。
例外:与其他高基数列组成复合索引时可考虑,如(gender, age)。
二、频繁更新的列
典型场景:计数器字段(如用户登录次数login_count)、实时状态字段
原因:
每次数据更新时需同步维护索引,导致额外的I/O和锁竞争,整体维护成本可能高于查询优化收益。
三、小数据量表
数据量范围:通常指几百行以下的表
原因:
全表扫描速度已足够快,而创建索引会增加存储和维护开销,可能降低性能。
四、大文本或二进制字段
类型:TEXT、BLOB等长文本或二进制类型
原因:
存储空间大:索引占用空间可能达到表数据的5%-15%。
查询效率低:长文本字段的索引树深度增加,检索速度降低。
替代方案:
使用前缀索引(如VARCHAR(20))或全文索引(FULLTEXT)。
五、计算字段
示例:通过其他字段计算得出的字段(如total_price = price * quantity)
原因:
依赖其他字段的计算结果,单独索引无法直接提升性能。
六、OR条件涉及的未索引字段
场景:查询条件中通过OR连接多个字段,且部分字段无索引
示例:WHERE a=1 OR b=2,若b无索引,优化器可能直接选择全表扫描。
七、以通配符开头的模糊查询字段
模式:LIKE '%keyword'或LIKE '%keyword%'
原因:
B-Tree索引无法高效支持左模糊匹配,导致索引失效。
八、数据分布严重倾斜的字段
示例:99%数据为同一值(如日志表中的错误码字段)
原因:
数据分布极度不均匀时,索引对查询优化的作用有限。
总结建议
动态评估查询需求:高频查询的低基数列可考虑复合索引,而非单独索引。
避免冗余索引:优先使用覆盖索引或复合索引,减少存储和维护成本。
验证索引有效性:通过EXPLAIN分析执行计划,确认索引是否被实际使用。
浙公网安备 33010602011771号