索引是一种允许我们在现有表中添加索引的数据结构。它能够提高对数据库表上记录的快速检索。它为索引列的每个值创建一个 条目 。我们使用它在访问表时快速找到记录,而不是搜索数据库表中的每一行。我们可以通过使用表的一个或多个 列 来创建索引,以便有效地访问记录。
当创建带有主键或唯一键的表时,它会自动创建一个名为 PRIMARY 的特殊索引。我们将这个索引称为聚集索引。除主键索引之外的所有索引都被称为非聚集索引或二级索引。
假设我们有一个联系人通讯录,其中包含用户的姓名和手机号码。在这个通讯录中,我们想要找到Martin Williamson的手机号码。如果通讯录是无序的,即通讯录的姓名没有按字母顺序排序,我们需要浏览所有页面并阅读每个姓名,直到找到我们要找的姓名。这种按顺序搜索姓名的方式称为顺序搜索。
要从表 contactbooks 中找到用户的姓名和联系方式,通常我们会执行以下查询:
mysql> SELECT mobile_number FROM contactbooks WHERE first_name = 'Martin' AND last_name = 'Taybu';
这个查询非常简单且容易。虽然它快速找到了用户的电话号码和姓名,但数据库会搜索整个表的行直到找到所需的行为止。假设,联系人表包含 数百万 行,那么如果没有索引,数据检索将需要很长时间才能找到结果。在这种情况下,数据库索引在返回所需结果和提高查询的整体性能方面起着重要作用。
通常,我们在数据库的表创建时创建索引。以下语句创建了一个包含两个列 col2 和 col3 的索引表。
mysql> CREATE TABLE t_index(
col1 INT PRIMARY KEY,
col2 INT NOT NULL,
col3 INT NOT NULL,
col4 VARCHAR(20),
INDEX (col2,col3)
);
如果我们想在表中添加索引,我们将使用以下的CREATE INDEX语句:
mysql> CREATE INDEX [index_name] ON [table_name] (column names)
在这个语句中, index_name 是索引的名称, table_name 是索引所属表的名称,而 column_names 是列的列表。
让我们为列 col4 添加新的索引,我们使用以下语句:
mysql> CREATE INDEX ind_1 ON t_index(col4);
默认情况下,如果我们没有指定索引的类型,MySQL 允许使用 BTREE 作为索引类型。下表展示了基于表的存储引擎的不同类型的索引。
SN | Storage Engine | Index Type |
---|---|---|
1. | InnoDB | BTREE |
2. | Memory/Heap | HASH, BTREE |
3. | MYISAM | BTREE |
在这个示例中,我们将创建一个表 学生 并在该表上执行CREATE INDEX语句。
表名:学生
现在,执行以下语句来返回班级为 CS专业 的学生的结果:
mysql> SELECT studentid, firstname, lastname FROM student WHERE class = 'CS';
这个语句将产生以下输出:
在上表中,可以看到四行,这四行表示的是班级是CS的学生。
如果你想看看MySQL如何在内部执行这个查询,请执行以下语句:
mysql> EXPLAIN SELECT studentid, firstname, lastname FROM student WHERE class = 'CS';
下面是您将获得的输出。在这里,MySQL扫描包含七行的整个表格,以找到班级为CS的学生。
现在,让我们使用以下语句为班级列创建一个索引。
mysql> CREATE INDEX class ON student (class);
执行上述语句后,索引成功创建。现在,运行以下语句查看MySQL内部如何执行此查询。
mysql> EXPLAIN SELECT studentid, firstname, lastname FROM student WHERE class = 'CS';
上述语句的输出如下所示:
在此输出中,MySQL在不扫描整个表的情况下从类索引中找到了四行。因此,它提高了从数据库表中检索记录的速度。
如果您想要 显示 一个表的索引,请执行以下语句:
mysql> SHOW INDEXES FROM student;
它将会给出以下输出。
本文链接:http://so.lmcjl.com/news/20479/