• mysql索引失效的几个场景


    失效场景

    MySQL索引失效可能发生在多种情况下,这些情况通常会导致查询性能下降。以下是一些常见的MySQL索引失效场景:

    1. 列未被索引:
      • 如果查询中涉及的列没有索引,MySQL将不得不执行全表扫描,这会导致性能问题,特别是在大表上。
    -- 假设没有为users表的email列创建索引
    SELECT * FROM users WHERE email = 'user@example.com';
    
    • 1
    • 2
    1. 列的数据类型不匹配:
      • 如果查询中的列与索引列的数据类型不匹配,MySQL将无法使用索引进行优化查询。
    -- 假设age是一个整数列,但进行了字符串比较
    SELECT * FROM users WHERE age = '25';
    
    • 1
    • 2
    1. 对列进行了函数操作:
      • 当在查询中对列进行了函数操作时,例如使用CONCATSUBSTRINGDATE_FORMAT等,MySQL将无法使用索引。例如,WHERE DATE_FORMAT(date_column, '%Y-%m-%d') = '2023-09-11'中的DATE_FORMAT函数会使索引失效。
    -- 假设dob是日期类型的列
    SELECT * FROM users WHERE YEAR(dob) = 1990;
    
    • 1
    • 2
    1. 使用通配符前缀:
      • 当查询中使用通配符前缀(例如LIKE 'prefix%')时,MySQL无法有效使用B-tree索引。这种情况下,可以考虑使用全文本搜索引擎(如MySQL的全文本搜索或Elasticsearch)来优化查询。
    -- 假设我们想查找以"John"开头的用户名
    SELECT * FROM users WHERE username LIKE 'John%';
    
    • 1
    • 2
    1. 使用OR条件:
      • 当查询中使用OR条件连接多个子条件时,如果其中至少一个子条件没有索引支持,整个查询可能会导致索引失效。这时可以尝试使用UNION或其他优化手段来避免OR条件。
    -- 假设没有为name和email列创建索引
    SELECT * FROM users WHERE name = 'Alice' OR email = 'alice@example.com';
    
    • 1
    • 2
    1. 组合索引顺序不合理:
      • 如果表上存在多列的组合索引,索引的列顺序可能会影响查询性能。如果查询中的列顺序与索引的列顺序不匹配,索引可能会失效。确保组合索引的列顺序与查询中的列顺序匹配可以改善性能。
    -- 假设有一个组合索引 (city, state),但查询中的条件与索引的顺序相反
    SELECT * FROM locations WHERE state = 'CA' AND city = 'Los Angeles';
    
    • 1
    • 2
    1. 数据分布不均匀:
      • 如果索引列中的数据分布不均匀,例如某些值非常频繁,而其他值很少出现,索引可能会失效。这会导致MySQL在查询时选择不使用索引,而执行全表扫描。
    -- 假设status列的数据分布不均匀,大部分行的status为'active'
    SELECT * FROM orders WHERE status = 'inactive';
    
    • 1
    • 2
    1. 隐式数据类型转换:
      • 当查询中的列与索引列的数据类型需要隐式转换时,索引可能会失效。尽量确保查询中的数据类型与索引列的数据类型一致。
    -- 假设id是整数列,但进行了字符串比较
    SELECT * FROM products WHERE id = '123';
    
    • 1
    • 2

    如果id是整数类型的列,但在查询中将其与字符串进行比较,MySQL 可能无法使用索引。确保查询中的数据类型与索引列的数据类型一致可以避免这种问题。

    解决方案

    要解决这些索引失效问题,可以采取以下措施:

    • 确保合适的列被索引。
    • 避免对索引列进行函数操作。
    • 尽量避免使用通配符前缀查询。
    • 谨慎使用OR条件。
    • 确保组合索引的列顺序与查询需求匹配。
    • 维护好数据的分布均匀性。
    • 避免隐式数据类型转换。
  • 相关阅读:
    算法与数据结构【30天】集训营——线性表之习题总结与考点分析含数据结构(C语言版 第2版)【严蔚敏 】答案(06)
    在Windows系统上实现电脑IP更改
    DataGrip 2023:让数据库开发变得更简单、更高效 mac/win版
    Leetcode—260.只出现一次的数字III【中等】
    国际腾讯云自主拼装直播 URL教程!!!
    【Linux】gcc/g++ && gdb 使用
    【RabbitMQ实战】07 3分钟部署一个RabbitMQ集群
    MyBatis中的动态SQL
    node.js基于vue框架潮牌官网设计与实现毕业设计源码010955
    关于安卓12闪屏页适配(一)
  • 原文地址:https://blog.csdn.net/qq_27575627/article/details/132834817