Chao's Blog Chao's Blog
首页
  • vue

    • vue路由
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • java
  • spring
  • springboot
  • springcloud
  • git
  • maven
  • nginx
  • tomcat
  • springmvc
  • jvm
  • 图数据库
  • mysql数据库
  • redis数据库
  • windows下docker安装nginx并挂载目录
  • linux命令
  • linux安装软件
  • linux脚本
  • idea
  • vscode
  • 归档
  • 综合项目

    • 若依项目
    • mall项目
  • java
  • mybatis
  • xxl-job
  • mybatis
GitHub (opens new window)

~chao

永远菜鸟,不断努力~
首页
  • vue

    • vue路由
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • java
  • spring
  • springboot
  • springcloud
  • git
  • maven
  • nginx
  • tomcat
  • springmvc
  • jvm
  • 图数据库
  • mysql数据库
  • redis数据库
  • windows下docker安装nginx并挂载目录
  • linux命令
  • linux安装软件
  • linux脚本
  • idea
  • vscode
  • 归档
  • 综合项目

    • 若依项目
    • mall项目
  • java
  • mybatis
  • xxl-job
  • mybatis
GitHub (opens new window)
  • cypher图数据

  • mysql数据库

    • mysql尚硅谷宋红康

    • 总结

    • mysql数据库备份与恢复

    • mysql日志

    • mysql性能优化

      • MySQL性能优化是什么,如何定位效率低下的SQL?
      • MySQL如何分析查询语句?
      • 索引到底对查询速度有什么影响?
        • MySQL优化数据库结构的3种方法
        • MySQL小技巧:提高插入数据的速度
        • MySQL优化服务器,提高MySQL的运行速度!
    • redis数据库

    • oracle数据库

    • 数据库
    • mysql数据库
    • mysql性能优化
    ~chao
    2023-01-29
    目录

    索引到底对查询速度有什么影响?

    # 索引到底对查询速度有什么影响?

    索引是数据库优化中最常用也是最重要的手段之一,通过索引可以帮助用户解决大多数的 SQL 性能问题。

    多数情况下,查询速度很慢时,加上索引便能解决问题。但也并非总是如此,因为优化不是件简单的事情。但是如果你不使用索引,在许多情况下,尝试通过其它途径来提高性能都纯粹是在浪费时间。应该首先使用索引来最大程度的改善性能,然后再看看是否还有其它有用的技术。

    索引提供了高效访问数据的方法,能够快速的定位表中的某条记录,加快数据库查询的速度,从而提高数据库的性能。

    如果查询时不使用索引,那么查询语句将查询表中的所有字段。这样查询的速度会很慢。使用索引进行查询,查询语句不必读完表中的所有记录,而只查询索引字段。这样可以减少查询的记录数,达到提高查询速度的目的。

    下面通过对比使用索引和不使用索引来分析索引对查询速度的影响。

    # 例 1

    为了便于读者更好的理解,分析之前,我们先查询一下 tb_students_info 数据表中的记录,SQL 语句和运行结果如下:

    mysql> SELECT * FROM tb_students_info;
    +----+------+
    | id | name |
    +----+------+
    |  1 | 张三 |
    |  2 | 李四 |
    |  3 | 王五 |
    |  4 | 赵六 |
    |  5 | 周七 |
    |  6 | 吴八 |
    |  7 | 朱九 |
    |  8 | 苏十 |
    +----+------+
    8 rows in set (0.02 sec)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    使用 EXPLAIN 分析未使用索引时的查询情况,SQL 语句和运行结果如下:

    mysql> EXPLAIN SELECT * FROM tb_students_info WHERE name='张三' \G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: tb_students_info
       partitions: NULL
             type: ALL
    possible_keys: NULL
              key: NULL
          key_len: NULL
              ref: NULL
             rows: 8
         filtered: 12.50
            Extra: Using where
    1 row in set, 1 warning (0.00 sec)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    由结果可以看到,rows 列的值是 8,说明查询语句扫描了表中的 8 条记录。

    没有索引的表就相当于一组无序的行,如果我们想找到某条记录就必须检查表的每一行,看看它是否与那个期望值相匹配。这是一个全表扫描操作,其效率很低,如果表很大,而且仅有少数几条记录与搜索条件相匹配,那么整个扫描过程的效率将会超级低。

    在 tb_students_info 表的 name 字段添加索引,SQL 语句和运行结果如下:

    mysql> CREATE INDEX index_name ON tb_students_info(name);
    Query OK, 8 rows affected (0.14 sec)
    
    1
    2

    使用 EXPLAIN 再次执行上面的查询语句,SQL 语句和运行结果如下:

    mysql> EXPLAIN SELECT * FROM tb_students_info WHERE name='张三' \G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: tb_students_info
       partitions: NULL
             type: ref
    possible_keys: index_name
              key: index_name
          key_len: 63
              ref: const
             rows: 1
         filtered: 100.00
            Extra: NULL
    1 row in set, 1 warning (0.00 sec)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    结果显示,rows 列的值为 1,表示这个查询语句只扫描了表中的 1 条记录。创建索引后访问的行由 8 行减少到 1 行,其查询速度自然比扫描 8 条记录快。而且 possible_keys 和 key 的值都是 index_name,这说明查询时使用了 index_name 索引。所以,在查询操作中,使用索引不仅能自动优化查询效率,还会降低服务器的开销。

    注意:由于 tb_students_info 表中记录较少,所以在这没有分析运行时间。表中记录多时,运行时间的差异也会体现出索引对查询速度的影响。

    编辑 (opens new window)
    上次更新: 2024/01/26, 05:03:22
    MySQL如何分析查询语句?
    MySQL优化数据库结构的3种方法

    ← MySQL如何分析查询语句? MySQL优化数据库结构的3种方法→

    最近更新
    01
    python使用生成器读取大文件-500g
    09-24
    02
    Windows环境下 Docker Desktop 安装 Nginx
    04-10
    03
    使用nginx部署多个前端项目(三种方式)
    04-10
    更多文章>
    Theme by Vdoing | Copyright © 2022-2024 chaos | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式