MySQL 索引教程 – 创建、添加和删除
什么是指数?
索引 MySQL 按有序顺序对数据进行排序。它们是在用于过滤数据的列上创建的。将索引视为按字母顺序排序的列表。查找按字母顺序排序的名称比查找未排序的名称更容易。
在频繁更新的表上使用索引可能会导致性能不佳。这是因为 MySQL 每次在表中添加或更新数据时都会创建一个新的索引块。通常,索引应该用在数据不经常更改但在选择搜索查询中经常使用的表上。
索引有什么用?
没有人喜欢运行缓慢的系统。几乎所有数据库系统都注重高系统性能。大多数企业在硬件方面投入大量资金,以便加快数据检索和操作速度。但企业在硬件方面的投资是有限的。优化数据库是一种更便宜、更好的解决方案。
响应时间缓慢通常是由于记录随机存储在数据库表中。搜索查询必须逐个循环遍历所有随机存储的记录才能找到所需的数据。这会导致从大型表中检索数据时数据库性能不佳。因此,使用索引对数据进行排序,以便于搜索。
语法:创建索引
索引可以用两种方式定义
- 在创建表时
- 创建表后
计费示例:
对于我们的 myflixdb,我们期望对全名数据库进行大量搜索。
我们将把“full_names”列添加到新表“members_indexed”中的索引中。
下面显示的脚本可以帮助我们实现这一点。
CREATE TABLE `members_indexed` ( `membership_number` int(11) NOT NULL AUTO_INCREMENT, `full_names` varchar(150) DEFAULT NULL, `gender` varchar(6) DEFAULT NULL, `date_of_birth` date DEFAULT NULL, `physical_address` varchar(255) DEFAULT NULL, `postal_address` varchar(255) DEFAULT NULL, `contact_number` varchar(75) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, PRIMARY KEY (`membership_number`),INDEX(full_names) ) ENGINE=InnoDB;
在以下位置执行上述 SQL 脚本 MySQL 针对“myflixdb”的工作台。
刷新 myflixdb 显示新创建的名为 members_indexed 的表。
“笔记” members_indexed 表在索引节点中有“full_names”。
随着成员基础的扩大和记录数量的增加,使用 WHERE 和 ORDER BY 子句在 members_indexed 表上进行的搜索查询将比没有定义索引的成员表上执行的搜索查询快得多。
添加索引基本语法
上面的例子在定义数据库表时创建了索引。假设我们已经定义了一个表,并且对该表的搜索查询非常慢。它们需要很长时间才能返回结果。在调查了这个问题之后,我们发现通过在 WHERE 子句中最常用的列上创建索引,可以大大提高系统性能。
我们可以使用以下查询来添加索引
CREATE INDEX id_index ON table_name(column_name);
假设电影表上的搜索查询非常慢,并且我们想使用“电影标题”上的索引来加快查询速度,我们可以使用以下脚本来实现。
CREATE INDEX `title_index` ON `movies`(`title`);
执行上述查询会在电影表中的标题字段上创建索引。
这意味着使用“标题”对电影表进行的所有搜索查询都会更快。
然而,与基于索引字段的搜索查询相比,电影表中其他字段的搜索查询仍然较慢。
请注意: 如果有必要,您可以根据您打算用于数据库搜索引擎的字段在多个列上创建索引。
如果您想查看特定表上定义的索引,可以使用以下脚本来执行此操作。
SHOW INDEXES FROM table_name;
现在让我们看一下 myflixdb 中电影表上定义的所有索引。
SHOW INDEXES FROM `movies`;
在以下位置执行上述脚本 MySQL 工作台 针对 myflixdb 我们给出了有关创建索引的结果。
请注意: 表上的主键和外键已被索引 MySQL。每个索引都有自己唯一的名称,并且还显示其定义的列。
语法:Drop index
drop 命令用于删除表上已定义的索引。
有时您可能已经在经常更新的表上定义了索引。您可能希望删除此类表上的索引以提高 UPDATE 和 INSERT 查询性能。删除表上的索引的基本语法如下。
DROP INDEX `index_id` ON `table_name`;
现在我们来看一个实际的例子。
DROP INDEX ` full_names` ON `members_indexed`;
执行上述命令将从 members_indexed 表中删除 id 为 ` full_names ` 的索引。
结语
- 索引在大幅提高性能方面非常强大 MySQL 搜索查询。
- 可以在创建表时定义索引,也可以在表创建后添加索引。
- 您可以在表的多个列上定义索引。
- SHOW INDEX FROM table_name 用于显示表上定义的索引。
- DROP 命令用于删除给定表上定义的索引。