MySQL索引是数据库优化中最重要的技术之一。索引可以大大提高MySQL的数据检索速度,就像书籍的目录可以帮助我们快速找到内容一样。没有索引的数据库查询需要全表扫描,效率极低;而合理使用索引可以将查询性能提升几个数量级。
索引是一种特殊的数据结构,它保存着数据表中一列或多列的值,并对这些值进行排序。通过索引,MySQL可以快速定位到数据的位置,而不必扫描整个表。
普通索引是最基本的索引类型,没有任何限制,允许在定义索引的列中插入重复值和空值。
这是最基本的索引创建方式:
CREATE INDEX indexName ON table_name(column_name(length));
参数说明:
indexName:索引名称table_name:要创建索引的表名column_name:要创建索引的列名length:可选参数,对于CHAR、VARCHAR类型,可以指定索引长度;对于BLOB和TEXT类型,必须指定长度ALTER TABLE table_name ADD INDEX index_name (column_name(length));
CREATE TABLE table_name (
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX index_name (username(length))
);
DROP INDEX index_name ON table_name;
唯一索引与普通索引类似,但索引列的值必须唯一,允许有空值。如果是组合索引,则列值的组合必须唯一。
CREATE UNIQUE INDEX index_name ON table_name(column_name(length));
ALTER TABLE table_name ADD UNIQUE index_name (column_name(length));
CREATE TABLE table_name (
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE index_name (username(length))
);
主键索引是一种特殊的唯一索引,不允许有空值。每个表只能有一个主键。
CREATE TABLE table_name (
ID INT NOT NULL AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
PRIMARY KEY (ID)
);
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
ALTER TABLE table_name DROP PRIMARY KEY;
复合索引是指在多个列上创建的索引。复合索引遵循最左前缀原则,即查询条件必须包含索引的最左列,才能使用索引。
CREATE INDEX index_name ON table_name (column1, column2, column3);
假设在(last_name, first_name)上创建了复合索引:
-- 可以使用索引
SELECT * FROM employees WHERE last_name = 'Smith';
SELECT * FROM employees WHERE last_name = 'Smith' AND first_name = 'John';
-- 不能使用索引(不满足最左前缀)
SELECT * FROM employees WHERE first_name = 'John';
ALTER TABLE命令提供了多种方式来管理表的索引:
ALTER TABLE table_name ADD PRIMARY KEY (column_list)ALTER TABLE table_name ADD UNIQUE index_name (column_list)ALTER TABLE table_name ADD INDEX index_name (column_list)ALTER TABLE table_name ADD FULLTEXT index_name (column_list)-- 添加普通索引
ALTER TABLE employees ADD INDEX idx_lastname (last_name);
-- 添加复合索引
ALTER TABLE employees ADD INDEX idx_fullname (last_name, first_name);
-- 删除索引
ALTER TABLE employees DROP INDEX idx_lastname;
使用SHOW INDEX命令可以查看表的索引信息:
SHOW INDEX FROM table_name;
为了更好地查看结果,可以添加\G参数格式化输出:
SHOW INDEX FROM table_name\G
SHOW INDEX命令返回的重要字段包括:
EXPLAIN SELECT * FROM employees WHERE last_name = 'Smith';