1.索引概念、优缺点及举例

(1)索引的概念
索引是表的目录,是数据库中专门用于帮助用户快速查询数据的一种数据结构。类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,以此快速定位查询数据。对于索引,会保存在额外的文件中。

(2)索引的优缺点
索引可以提高查询速度,会减慢写入速度,索引的缺点是创建和维护索引需要耗费时间。
索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过5个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

(3)索引举例
关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢。

2.什么样的字段适合创建索引

(1)表的主键、外键必须有索引;外键是唯一的,而且经常会用来查询。
(2)经常与其他表进行连接的表,在连接字段上应该建立索引。
(3)数据量超过300的表应该有索引。
(4)重要的SQL或调用频率高的SQL,比如经常出现在where子句中的字段,order by,group by, distinct的字段都要添加索引。
(5)经常用到排序的列上,因为索引已经排序。
(6)经常用在范围内搜索的列上创建索引,因为索引已经排序了,其指定的范围是连续的。

3.什么场景不适合创建索引

(1)对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
(2)对于那些只有很少数据值的列也不应该增加索引。因为本来结果集合就是相当于全表查询了,所以没有必要。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
(3)对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
(4)当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
(5)不会出现在where条件中的字段不该建立索引。
(6)如果列均匀分布在 1 和 100 之间,却只是查询中where key_part1 > 1 and key_part1 < 90不应该增加索引

4.索引的分类

(1)普通索引:仅加速查询,最基本的索引,没有任何限制,是我们大多数情况下使用到的索引。
直接创建索引

CREATE INDEX index_name on table_name(column_name)

修改表结构的方式添加索引

ALTER TABLE table_name ADD INDEX index_name ON (column_name)

(2)唯一索引:与普通索引类型,不同的是:加速查询 + 列值唯一(可以有null)

创建唯一索引

CREATE UNIQUE INDEX index_name ON table(column_name)

修改表结构的方式添加索引

ALTER TABLE table_name ADD UNIQUE INDEX index_name ON (column_name)

(3)全文索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。目前只有char、varchar,text 列上可以创建全文索引。

直接创建索引

CREATE FULLTEXT INDEX index_fulltext_content ON table_name(col_name)

修改表结构添加全文索引

ALTER TABLE table_name ADD FULLTEXT index_fulltext_content(col_name)

(4)复合索引:复合索引是在多个字段上创建的索引。复合索引遵守“最左前缀”原则,即在查询条件中使用了复合索引的第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。

直接创建索引

create index index_name on table_name(col_name1,col_name2,…);

修改表结构的方式添加索引

alter table table_name add index index_name(col_name,col_name2,…);

(5)删除索引

DROP INDEX index_name ON table
alter table table_name drop index index_dex ;

(6)查看索引

show index from healerjean;
这个时候,我们会发现其实主键id也是一个索引

5.使用 explain 查看 索引是否生效!

6.常见索引失效的情况

(1)like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
(2)只要表中的某个字段有一个值为null,此列上的索引将会失效。
复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。
(3)复合索引遵守“最左前缀”原则,即在查询条件中使用了复合索引的第一个字段,索引才会被使用。
(4)不要在索引列上做任何操作(计算,函数,(自动或者手动)类型装换),否则会导致索引失效。
(5)mysql使用不等于(!= 或者<>)的时候,无法使用索引,会导致索引失效。
(6)mysql中,如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。
(7)如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引