索引到底对查询速度有什么影响?
# 索引到底对查询速度有什么影响?
索引是数据库优化中最常用也是最重要的手段之一,通过索引可以帮助用户解决大多数的 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)
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)
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)
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)
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 表中记录较少,所以在这没有分析运行时间。表中记录多时,运行时间的差异也会体现出索引对查询速度的影响。
- 01
- python使用生成器读取大文件-500g09-24
- 02
- Windows环境下 Docker Desktop 安装 Nginx04-10
- 03
- 使用nginx部署多个前端项目(三种方式)04-10