索引介绍
? 索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
? 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在 单独的索引文件中,也可能和数据一起存储在数据文件中)。
我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都 是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。
索引的优势和劣势
1. 优势:
-
可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录。 – 检索
-
通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。 --排序
- 被索引的列会自动进行排序,包括【单列索引】和【组合索引】,只是组合索引的排序要复杂一些。
- 如果按照索引列的顺序进行排序,对应order by语句来说,效率就会提高很多。
- where 索引列在存储引擎层处理 索引下推 ICP
2. 劣势:
- 索引会占据磁盘空间
- 索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,MySQL不仅要保存数据,还要保存或者更新对应的索引文件。
索引的分类
1. 单列索引
- 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询 数据更快一点。 add index
- 唯一索引:索引列中的值必须是唯一的,但是允许为空值. add unique index
- 主键索引:是一种特殊的唯一索引,不允许有空值。 pk
2. 组合索引
- 在表中的多个字段组合上创建的索引 add index(col1,col2…)
- 组合索引的使用,需要遵循最左前缀原则(最左匹配原则)。
- 一般情况下,建议使用组合索引代替单列索引(主键索引除外)。
3. 全文索引
-
只有在MyISAM引擎、InnoDB(5.6以后)上才能使用,而且只能在CHAR,VARCHAR,TEXT类型字段上使用全文索 引。 fulltext
-
优先级最高 先执行 不会执行其他索引
-
存储引擎 决定执行一个索引
4. 空间索引
不做介绍,一般使用不到。
创建索引的场景
1. 哪些情况需要创建索引
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 多表关联查询中,关联字段应该创建索引 on 两边都要创建索引
- 查询中排序的字段,应该创建索引
- 频繁查找字段 覆盖索引
- 查询中统计或者分组字段,应该创建索引 group by
2. 哪些情况不需要创建索引
- 表记录太少
- 经常进行增删改操作的表
- 频繁更新的字段
- where条件里使用频率不高的字段
索引的使用
1. 创建索引
-
单列索引之普通索引
1
2CREATE INDEX index_name ON table(column(length)) ;
ALTER TABLE table_name ADD INDEX index_name (column(length)) ; -
单列索引之唯一索引
1
2CREATE UNIQUE INDEX index_name ON table(column(length)) ;
alter table table_name add unique index index_name(column); -
单列索引之全文索引
1
2CREATE FULLTEXT INDEX index_name ON table(column(length)) ;
alter table table_name add fulltext index_name(column) -
组合索引
1ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10)) ;
2. 删除索引
1 | DROP INDEX index_name ON table |
3. 查看索引
1 | SHOW INDEX FROM table_name |