📜  如何在MySQL中创建索引

📅  最后修改于: 2020-11-17 02:32:27             🧑  作者: Mango

如何在MySQL中创建索引

索引是一种数据结构,它使我们可以在现有表中添加索引。它使您能够改进更快地检索数据库表上的记录。它为索引列的每个值创建一个条目。我们使用它来快速查找记录,而无需在访问表时搜索数据库表中的每一行。我们可以通过使用表的一个或多个列来创建索引,以高效地访问记录。

使用主键或唯一键创建表时,它会自动创建一个名为PRIMARY的特殊索引。我们称此索引为聚集索引。除PRIMARY索引以外的所有索引都称为非聚集索引或二级索引。

MySQL中的索引需求

假设我们有一本通讯录,其中包含用户的姓名和手机号码。在此联系方式中,我们要查找Martin Williamson的手机号码。如果通讯录是无序格式,则表示通讯录的名称不是按字母顺序排序的,我们需要遍历所有页面并阅读每个名称,直到找不到所需的姓名为止。这种搜索名称称为顺序搜索。

通常,为了从表通讯录中查找用户的姓名和联系方式,我们执行了以下查询:

mysql> SELECT mobile_number FROM contactbooks WHERE first_name = 'Martin' AND last_name = 'Taybu';

此查询非常简单。尽管它可以快速找到用户的电话号码和姓名,但数据库会搜索表的整个行,直到找不到所需的行为止。假设contactbooks表包含数百万行,那么在没有索引的情况下,数据检索需要大量时间才能找到结果。在那种情况下,数据库索引在返回期望的结果中起着重要的作用,并提高了查询的整体性能。

MySQL CREATE INDEX语句

通常,我们在数据库中创建表时创建索引。以下语句创建一个表,该表的索引包含两列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;

它将给出以下输出。