创建索引基本语法
- 创建普通索引
CREATE INDEX index_name ON table_name (column_name);
- 创建唯一索引
CREATE UNIQUE INDEX index_name ON table_name (column_name);
- 创建复合索引
CREATE INDEX index_name ON table_name (column1, column2, ...);
- 在创建表时创建索引
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
INDEX index_name (column1),
UNIQUE INDEX unique_index_name (column2)
);
通过分析查询语句初步优化索引创建
- 确定查询的频繁字段
- 分析哪些字段经常在
WHERE
子句、JOIN
子句中被使用。例如,在查询SELECT * FROM users WHERE age > 18 AND city = 'Beijing';
中,age
和city
字段频繁出现在WHERE
子句,可考虑为这些字段创建索引。
- 前缀索引的使用
- 对于长字符串字段,可使用前缀索引以减少索引存储空间。例如,对于一个很长的
text
类型的description
字段,若查询经常以该字段开头匹配,可创建前缀索引:CREATE INDEX idx_description ON table_name (description(10));
这里10表示使用前10个字符创建索引。
- 避免冗余和重复索引
- 冗余索引指的是一个索引能完全被另一个索引替代。例如,如果已经有了复合索引
CREATE INDEX idx_abc ON table_name (a, b, c);
,那么单独为a
创建索引CREATE INDEX idx_a ON table_name (a);
就是冗余的,因为复合索引已经包含了a
字段的索引信息。重复索引指的是完全相同的索引,应避免创建。
- 覆盖索引
- 当查询中所有需要的列都包含在索引中时,称为覆盖索引。例如,查询
SELECT age, city FROM users WHERE age > 18;
,如果创建索引CREATE INDEX idx_age_city ON users (age, city);
,MySQL可以直接通过索引获取所需数据,而不需要回表操作,从而提高查询性能。