MySQL 性能:如何利用 MySQL 数据库索引

在本教程中,我们将介绍索引的一些基础知识。 作为 MySQL 系列的一部分,我们将介绍 MySQL 索引的功能及其在优化数据库性能中所起的作用。 Liquid Web 建议在对生产级应用程序进行任何更改之前咨询 DBA。

什么是索引?

索引是 MySQL 中一种强大的结构,可用于从常见查询中获得最快的响应时间。 MySQL 查询通过从指定的列或列集生成一个称为索引的较小表来提高效率。 这些列称为键,可用于强制唯一性。 下面是一个简单的可视化 example 使用两列作为键的索引。

+------+----------+----------+
| ROW | COLUMN_1 | COLUMN_2 |
+------+----------+----------+
| 1 | data1 | data2 |
+------+----------+----------+
| 2 | data1 | data1 |
+------+----------+----------+
| 3 | data1 | data1 |
+------+----------+----------+
| 4 | data1 | data1 |
+------+----------+----------+
| 5 | data1 | data1 |
+------+----------+----------+

这个类比将 MySQL 索引与书后的索引进行比较。

查询利用索引来识别和检索目标数据,即使它们是键的组合。 如果没有索引,运行相同的查询会导致检查每一行以获取所需数据。 索引产生了一种快捷方式,在扩展表上的查询时间要快得多。 教科书类比可以提供另一种常见的方式来可视化索引的功能。

何时启用索引?

索引仅对具有定期访问信息的大型表有利。 例如,继续我们的教科书类比,索引只有十几页的儿童故事书是没有意义的。 与建立和维护索引、查询这些索引、然后查看所提供的每一页相比,简单地阅读这本书以找到“turtle”一词的每个出现位置更有效。 在计算世界中,那些与索引相关的额外任务代表了资源的浪费,如果不进行索引则更好。

如果没有索引,当表增长到巨大的比例时,响应时间会受到针对这些钝表的查询的影响。 低效查询表现为应用程序或网站性能的延迟。 我们通常通过使用 MySQL 慢查询日志功能来识别这种延迟。 您可以在本系列的第一篇文章中找到有关使用慢查询日志功能的更多详细信息:MySQL 性能:识别长查询。
一旦一张巨大的桌子达到它的临界点,它就有可能导致应用程序和网站停机。 对不断增长的数据库进行例行评估可以建立最佳数据库性能并避免长查询的固有中断。

MySQL 索引的优点与缺点

使用 MySQL 索引有利有弊,我们将讨论重要的利弊供您考虑。 这些方面将指导您决定索引是否适合您的情况。

快速的数据传输和 OLAP 的理想选择。

一个索引包含哪些信息?

选择要索引的内容可能是索引数据库中最具挑战性的部分。 确定什么是重要的可以索引,什么是良性的不能索引。 一般而言,索引在您经常执行的查询中作为 WHERE 子句主题的那些列上效果最好。 考虑下面的简化表:

ID, TITLE, LAST_NAME, FIRST_NAME, MAIDEN_NAME, DOB, GENDER, AGE, DESCRIPTION, HISTORY, ETC...

如果您的查询依赖于使用 LAST_NAME 和 FIRST_NAME 测试 WHERE 子句,那么通过这两列进行索引将显着增加查询响应时间。 或者,如果您的查询依赖于简单的 ID 查找,则按 ID 索引将是更好的选择。

这些例子只是初步的 example,并且 MySQL 内置了几种类型的索引结构。 以下 MySQL 页面更详细地讨论了这些类型的索引,并推荐给任何考虑建立索引的人阅读: MySQL 如何使用索引

什么是唯一索引?

在评估将哪些列用作索引中的键时要考虑的另一点是是否使用 UNIQUE 约束。 设置 UNIQUE 约束将根据配置的索引键强制执行唯一性。 与任何键一样,这可以是单列或多列的串联。 这个约束的作用是保证根据配置的key,表中没有重复的条目。

UNIQUE 约束提高了写入速度,增加了执行负担。

什么是主键索引?

与 UNIQUE 约束一样,PRIMARY KEY 用于优化索引。 此约束确保指定的 PRIMARY KEY 不能为空值。 因此,在针对相关表的 InnoDB 存储引擎上运行时会出现性能提升。 这种提升是由于 InnoDB 物理存储数据的方式,将空值行放置在与具有值的行的连续序列中的键中。 启用此约束可确保表中的行保持连续顺序,以便更快地响应。

主键索引对于大表是绝对必要的。

管理索引

管理索引的关键字:dbName、tableName、indexName

现在我们将介绍一些使用 MySQL 语法操作索引的基础知识。 在示例中,我们将包括索引的创建、删除和列出。 请记住,这些示例具有特定关键字的占位符条目。 这些关键字本质上是不言自明的,便于阅读,下面是它们的概述。

您可以使用 dbName.tableName 代替 tableName。

列出/显示索引

表可以有多个索引。 管理索引将不可避免地需要能够列出表上的现有索引。 查看索引的语法如下。

SHOW INDEX FROM tableName;

从表名显示索引; 显示所有索引。

索引存在于 3 个不同的列上。

创建索引

索引创建具有简单的语法。 困难在于确定哪些列需要索引以及是否需要强制唯一性。 下面我们将说明如何在有和没有 PRIMARY KEY 和 UNIQUE 约束的情况下创建索引。

如前所述,表可以有多个索引。 多重索引对于创建与您的应用程序或网站所需的查询相协调的索引很有用。 默认设置允许每个表最多 16 个索引,增加这个数字但通常超过必要。 索引可以在创建表期间创建,也可以稍后作为附加索引添加到表中。 我们将在下面介绍这两种方法。

创建太多索引会增加延迟,但如果您必须在 MySQL 配置中增加缓冲区。

示例:创建具有标准索引的表

您可以为多个列创建索引,使用 ID 作为索引。

CREATE TABLE tableName (
ID int,
LName varchar(255),
FName varchar(255),
DOB varchar(255),
LOC varchar(255),
INDEX ( ID )
);

示例:创建具有唯一索引和主键的表

您可以在多个列上创建主键和唯一约束。

CREATE TABLE tableName (
ID int,
LName varchar(255),
FName varchar(255),
DOB varchar(255),
LOC varchar(255),
PRIMARY KEY (ID),
UNIQUE INDEX ( ID )
);

示例:向现有表添加索引

CREATE INDEX 语句创建一个索引并命名它。

CREATE INDEX indexName ON tableName (ID, LName, FName, LOC);

示例:使用主键向现有表添加索引

CREATE UNIQUE 命令可以为表添加索引,确保没有重复数据。

CREATE UNIQUE INDEX indexName ON tableName (ID, LName, FName, LOC);

删除索引

在管理索引时,您可能会发现有必要删除一些索引。 删除索引也是一个非常简单的过程,见 example 以下:

DROP INDEX 命令让我们删除特定列上的索引。

DROP INDEX indexName ON tableName;

您需要了解的有关高可用性的所有信息

有很多方法可以优化您的数据库以获得真正的效率。 如果您想了解更多信息或转换 MySQL 中可用的搜索引擎类型,请阅读我们的 MyISAM 与 InnoDB 教程。 或者,如果您需要高性能数据库,请查看我们的 MySQL 产品页面以查看不同的选项。