博客
关于我
mysql 中索引的问题
阅读量:794 次
发布时间:2023-02-10

本文共 1645 字,大约阅读时间需要 5 分钟。

MySQL索引口诀及使用EXPLAIN检查索引的实用指南

1. MySQL索引口诀

在数据库优化中,索引是提升查询性能的关键工具之一。以下是MySQL索引使用的口诀,帮助开发人员更好地理解索引的原则和使用方法:

  • 全值匹配优先

    MySQL首选满足条件的全值匹配,而不是部分值。例如,在WHERE条件中,尽量使用完整的列值进行匹配。

  • 最左前缀原则

    在复合索引中,优先选择最左边的前缀。因为索引树是基于最左边的键进行搜索的,前缀越长,搜索效率越高。

  • 索引列少计算,范围查询少失效

    避免在索引列上进行范围查询(如WHERE a BETWEEN 1 AND 100),因为这会导致索引失效,影响查询性能。

  • LIKE百分比写在最后

    LIKE条件中,百分比比较 (%) 最好放在最后,避免索引失效。

  • 覆盖索引不写星号

    使用覆盖索引时,不需要在WHEREHAVING中写*,因为这会导致索引失效。

  • JOIN类型一致,ORDER条件明确

    JOIN操作中,确保连接类型一致(如eq_refref等),避免不必要的索引失效。

  • 避免使用OR空值或0/1条件

    WHEREHAVING子句中,避免使用空值或0/1进行比较,这会导致索引失效。

  • 2. 使用EXPLAIN检查SQL语句中的索引使用情况

    EXPLAIN是MySQL提供的一种强有力的工具,用于分析和优化SQL语句。以下是使用EXPLAIN的基本方法及解读结果:

  • 基本用法

    使用EXPLAIN时,默认会输出非扩展版的结果。要查看详细信息,可以在命令末尾添加EXPLAIN extendedEXPLAIN all

  • 全表扫描与索引使用情况

    • 全表扫描(没有使用索引)

      EXPLAIN extended SELECT * FROM pay_refund_detail

      结果中的type列显示为systemconst,表示查询未使用索引,可能是因为没有合适的索引存在或索引失效。

    • 使用索引

      EXPLAIN extended SELECT * FROM pay_refund_detail WHERE order_code=123

      结果中的type列显示为eq_refref,表明查询成功使用了索引。

  • 解读EXPLAIN结果

    以下是EXPLAIN输出的主要字段及其含义:

    • id:SELECT查询序列号。
    • select_type:查询类型,如SIMPLEDEPENDENT SUBQUERY等。
    • table:查询涉及的表名。
    • type:联接类型,如eq_ref(最佳)、ref(次优)、index等。
    • possible_keys:MySQL可用的索引列表。
    • key:实际使用的索引名,NULL表示未使用索引。
    • key_len:使用的索引长度。
    • ref:与索引匹配的列名或常数值。
    • rows:估计需要检查的行数。
    • `filtered:通过条件筛选的行数百分比。
    • Extra:详细信息,包括是否使用了索引、临时表等。
  • 3. 字段解释

    在使用EXPLAIN工具时,了解每个字段的含义可以帮助你更好地分析和优化查询。以下是EXPLAIN输出中常见字段的解释:

    • id:SELECT查询的唯一标识符。
    • select_type:查询类型,包括SIMPLEPRIMARYUNION等。
    • table:查询结果引用的表名。
    • type:联接类型,决定了查询效率和索引使用情况。
    • possible_keys:MySQL可用的索引列表,帮助你确定是否需要添加索引。
    • key:实际使用的索引,NULL表示未使用索引。
    • key_len:索引的长度,长度越长,索引的选择范围越大。
    • ref:与索引列匹配的列名或常数值。
    • rows:估计需要检查的行数,帮助评估查询性能。
    • filtered:通过条件筛选的行数百分比,评估过滤效果。
    • Extra:详细信息,包括索引使用情况、是否使用了临时表等。

    通过以上方法和工具,你可以更好地了解SQL语句的执行情况,优化索引使用,提升数据库性能。

    转载地址:http://wwbfk.baihongyu.com/

    你可能感兴趣的文章
    MySQL —— 在CentOS9下安装MySQL
    查看>>
    MySQL —— 视图
    查看>>
    web项目 log4j2 指定配置文件路径
    查看>>
    mysql 不区分大小写
    查看>>
    mysql 两列互转
    查看>>
    MySQL 中开启二进制日志(Binlog)
    查看>>
    MySQL 中文问题
    查看>>
    MySQL 中日志的面试题总结
    查看>>
    mysql 中的all,5分钟了解MySQL5.7中union all用法的黑科技
    查看>>
    MySQL 中的外键检查设置:SET FOREIGN_KEY_CHECKS = 1
    查看>>
    Mysql 中的日期时间字符串查询
    查看>>
    mysql 中索引的问题
    查看>>
    MySQL 中锁的面试题总结
    查看>>
    MySQL 中随机抽样:order by rand limit 的替代方案
    查看>>
    MySQL 为什么需要两阶段提交?
    查看>>
    mysql 为某个字段的值加前缀、去掉前缀
    查看>>
    mysql 主从
    查看>>
    mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
    查看>>
    mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
    查看>>
    mysql 主从关系切换
    查看>>