索引是什么?
如果你去过图书馆,应该会知道图书馆的检索系统。图书馆为图书准备了检索目录,包括书名、书号、对应的位置信息,包括在哪个区、哪个书架、哪一层。我们可以通过书名或书号,快速获知书的位置,拿到需要的书
MySQL 中的索引,就相当于图书馆的检索目录,它是帮助 MySQL 系统快速检索数据的一种存储结构。我们可以在索引中按照查询条件,检索索引字段的值,然后快速定位数据记录的位置,这样就不需要遍历整个数据表了。而且,数据表中的字段越多,表中数据记录越多,速度提升越是明显
举个例子:全家某个门店的销售流水表有 400 万条数据,现在我要查看一下商品编号是 100 的商品在 2021-11-26 这一天的销售情况,查询代码如下
SELECT quantity, price, datetime FROM 流水表
WHERE date > '2021-11-26' AND date < '2021-11-27' AND itemnumber = 100;
+----------+--------+---------------------+
| quantity | price | date |
+----------+--------+---------------------+
| 1.000 | 220.00 | 2020-11-26 19:45:36 |
| 1.000 | 220.00 | 2020-11-26 08:56:37 |
+----------+--------+---------------------+
2 rows in set (8.08 sec)
复制代码
可以看到结果总共有 2 条记录,可是却花了 8 秒钟,非常慢。同时,这里我没有做表的关联,这只是单表的查询,而且只是一个门店几个月的数据而已。而总部是把所有门店的数据都汇总到一起,查询速度更慢,这样的查询效率,我们肯定是不能接受的
这个时候,我们就可以给数据表添加索引
单字段索引
MySQL 支持单字段索引和组合索引,而单字段索引比较常用,我们先来学习下创建单字段索引的方法。如何创建单字字段索引
创建单字段索引
- 通过create语句直接给已经存在的表创建索引
- 在创建表的同时创建索引
- 通过修改表来创建索引
直接给数据表创建索引的语法:
create INDEX 索引名 ON TABLE 表名(字段)
复制代码
创建表的同时创建索引的语法:
create table 表名
(
字段 数据类型,
......
{INDEX | KEY} 索引名(字段)
)
复制代码
修改表的同时创建索引的语法:
alter table 表名 ADD {INDEX | KEY} 索引名(字段)
复制代码
注意:给表设定主键约束或者唯一性约束的时候,MySQL 会自动创建主键索引或唯一性索引
单字段索引的作用原理
要知道索引是怎么起作用的,我们需要借助 MySQL 中的 EXPLAIN 这个关键字
EXPLAIN 关键字能够查看 SQL 语句的执行细节,包括表的加载顺序,表是如何连接的,以及索引使用情况等
首先我们有这样一张表和数据
itemnumber barcode goodsname price
1 0001 书 0.47
2 0002 笔 0.44
3 0002 胶水 0.19
复制代码
其中itemnumber
是自增主键,barcode