1、什么是索引
- 索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多
- 如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间
2、索引的优劣势
优势
- 提高数据检索效率,降低数据库的IO成本
- 降低数据排序的成本,降低了CPU的消耗。
劣势
- 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占空间的。
- 虽然索引大大提高了查询速度,同时确会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。
3、索引的分类
- 单值索引:即一个索引只包含单个列,一个表可以有多个单列索引。
- 唯一索引:索引列的值必须唯一,但允许有空值。-
- 复合索引:个索引包含多个列。INDEX Multilclx(id,name,age)
- 全文索引:只有在MylSAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引
- 空间索引:空间索引是对空间数据类型的字段建立的索引
4、索引操作
创建索引
CREATE INDEX 索引名称 ON table (column[, column]...);
create INDEX salary_index ON emp(salary)
删除索引
DROP INDEX索引名称ON表名
查看索引
show index from表名;
自动创建索引
- 在表上定义了主键时,会自动创建一个对应的唯一索引
- 在表上定义了一个外键时,会自动创建一个普通索引
5、索引结构
会先对数据进行排序
btree索引
- B+树索引
- B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。
如下图,比如要查找元素7,则从4开始看,比4小左边的都不看了,查找顺序为4-6-7
hash索引
- 哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。
- hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以Hash 索引的查询效率要远高于B-Tree索引。
6、哪些情况需要创建索引
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中与其他表关联的字段,外键关系建立索引
- 频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引
- WHERE亲件里用不到的字段不创建索引
- 查询中排序的字段,排序的字段若通过索引去访问将大大提高排序速度查询中统计或者分组字段
7、哪些情况不需要创建索引
- 表记录太少
- 经常增删改的表、
- 如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果