一、索引类型
1、普通索引
这是最基本的索引,它没有任何限制,比如上文中为title字段创建的索引就是一个普通索引,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。
# 直接创建索引
CREATE INDEX index_name ON table(column(length));
# 修改表结构的方式添加索引
ALTER TABLE table_name ADD INDEX index_name ON (column(length));
# 删除索引
DROP INDEX index_name ON table;
2、唯一索引
与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须是唯一的,创建方法和普通索引类似。
# 创建唯一索引
CREATE UNIQUE INDEX index_name ON table(column(length));
# 修改表结构
ALTER TABLE table_name ADD UNIQUE INDEX index_name ON (column(length));
3、主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。
# 一个表只能有一个主键。
# 创建主键索引
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
PRIMARY KEY(ID) );
# 修改表结构
alter table mytable add primary key(ID);
4、组合索引
SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。
# 修改表结构
ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10));
# 使用到上面的索引
SELECT * FROM article WHREE title='测试' AND time=1234567890;
SELECT * FROM article WHREE utitle='测试';
# 未使用到上面的索引
SELECT * FROM article WHREE time=1234567890;
五、全文索引
全文索引是目前搜索引擎使用的一种关键技术。它能够利用分词技术等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。(不建议使用)
全文索引注意事项:
- MySql自带的全文索引只能用于数据库引擎为MYISAM的数据表,如果是其他数据引擎,则全文索引不会生效。此外,MySql自带的全文索引只能对英文进行全文检索,目前无法对中文进行全文检索。
- 使用MySql自带的全文索引时,如果查询字符串的长度过短将无法得到期望的搜索结果。MySql全文索引所能找到的词默认最小长度为4个字符。另外,如果查询的字符串包含停止词,那么该停止词将会被忽略。
- 在使用全文索引,请尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。
# 创建全文索引
CREATE TABLE `article` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) DEFAULT NULL,
`content` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `title` (`title`,`content`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
# 修改表结构
ALTER TABLE article ADD FULLTEXT INDEX fulltext_article(title,content);
# 注意如何使用
# 在MySql中创建全文索引之后,在数据库中进行模糊查询是使用like关键字进行查询的,例如:
SELECT * FROM article WHERE content LIKE ‘%查询字符串%’;
# 但是,全文索引也这样使用吗?当然不是,我们必须使用特有的语法才能使用全文索引进行查询,
# 例如,我们想要在article表的title和content列中全文检索指定的查询字符串,我们可以如下编写SQL语句:
SELECT * FROM article WHERE MATCH(title,content) AGAINST (‘查询字符串’);
二、索引创建时机
- 字段的数值有唯一性的限制
业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。(来源:Alibaba)不要以为唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明显的。
- 频繁作为 WHERE 查询条件的字段
某个字段在SELECT语句的 WHERE 条件中经常被使用到,那么就需要给这个字段创建索引了。尤其是在数据量大的情况下,创建普通索引就可以大幅提升数据查询的效率。
- 经常 GROUP BY 和 ORDER BY 的列
索引就是让数据按照某种顺序进行存储或检索,因此当我们使用 GROUP BY 对数据进行分组查询,或者使用 ORDER BY 对数据进行排序的时候,就需要 对分组或者排序的字段进行索引 。如果待排序的列有多个,那么可以在这些列上建立 组合索引 。
- UPDATE、DELETE 的 WHERE 条件列
对数据按照某个条件进行查询后再进行 UPDATE 或 DELETE 的操作,如果对 WHERE 字段创建了索引,就能大幅提升效率。原理是因为我们需要先根据 WHERE 条件列检索出来这条记录,然后再对它进行更新或删除。如果进行更新的时候,更新的字段是非索引字段,提升的效率会更明显,这是因为非索引字段更新不需要对索引进行维护。
- DISTINCT 字段需要创建索引
有时候我们需要对某个字段进行去重,使用 DISTINCT,那么对这个字段创建索引,也会提升查询效率,同时显示出来的记录还是按照 DISTINCT字段 递增的顺序 进行展示的。这是因为索引会对数据按照某种顺序进行排序,所以在去重的时候也会快很多。
- 多表 JOIN 连接操作时,创建索引注意事项
连接表的数量尽量不要超过 3 张 ,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增长会非常快,严重影响查询的效率。
对 WHERE 条件创建索引 ,因为 WHERE 才是对数据条件的过滤。如果在数据量非常大的情况下,没有 WHERE 条件过滤是非常可怕的。
对用于连接的字段创建索引 ,并且该字段在多张表中的 类型必须一致。否则会发生隐式转换,使用到了函数,会导致索引失效。
三、索引使用注意事项
- 需要注意的是,索引不是越多越好,要限制索引的数目,建议单张表索引数量不超过6个。
- 每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。
- 索引会影响INSERT、DELETE、UPDATE等语句的性能,因为表中的数据更改的同时,索引也会进行调整和更新,会造成负担。
- 优化器在选择如何优化查询时,会根据统一信息,对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,会增加MySQL优化器生成执行计划时间,降低查询性能。
四、不适合创建索引情况
- 在where中使用不到的字段不要建立索引
- 在数据量不大(比如不到 1000 行)的情况下,索引就发挥不出作用了
- 有大量重复数据的列上不要建立索引
- 避免对经常更新的表创建过多的索引
- 不建议用无序的值作为索引,可能会频繁导致页分裂
- 删除不再使用或者很少使用的索引
- 不要定义冗余或重复的索引