性能优化--索引

索引是一种优化db查询的技巧,一种将表数据排序的结构;通过将db的单列/多列值设定为索引,在查询时就能根据索引值,直接查询到索引所在行的内存地址,不用查询全表了,从而大幅提供查询的速度

大纲

1
2
3
4
索引的底层(原理)
索引的类型
索引的操作
索引的使用

索引的底层

底层主要维护了一个排序的数组,其中含有索引值和所在行内存地址的一组数据;索引底层有两种数据结构,B+数索引、哈希索引

  • B+树索引:是一个平衡树,下标是索引,值是内存地址;查询的时间复杂度为O(log(n));可以用于排序(索引表是数据有顺序),和范围查找
  • 哈希索引:是哈希的键值对,键是索引值,值为内存地址;查询的时间复杂度为O(1);只能用于等值比较(键值)

索引的类型

1
2
3
4
5
6
普通索引:任何列都能做索引,索引无值要求,可重复或为空
唯一索引:索引所在列的值必须唯一,但列值可为空
主键索引:将列的主键作为索引,所在列,值唯一,且不能为空
组合索引:将多个列组合视作索引;如果一个表中的数据在查询时有多个字段总是同时出现则这些字段就可以作为复合索引,形成索引覆盖可以提高查询的效率(实际提高的是where过滤的效率)
全文索引:只有用于Innodb、MyIsam 表格,并且只能对 CHAR、VARCHAR、TEXT 列建全文索引;用于当索引的字段值很长,且用like模糊匹配效率较低时;语法
前缀索引:当索引列是字符串时,可以使用字符串前缀作为索引,减少索引长度

索引的操作

1
2
3
4
5
6
7
8
9
10
创建索引:create index index_name on table_name(列名)
删除索引:drop index index_name on table_name
修改索引:alter table
添加普通/组合索引:alter table table_name add INDEX index_name(列1,列2)
添加唯一索引:alter tablet table_name ADD UNIQUE index_name (列1)
添加主键索引:alter table table_name ADD PRIMARY KEY index_name(列1)
添加全表索引:alter table table_name ADD DULLTEXT index_name (列1)
添加前缀索引:alt table table_name add INDEX index_name(email(6)) //这里以email列的键值前6位作为索引
编辑索引:先删除--后添加
查询索引:show index from table_name

索引的使用

1
2
3
4
使用于大量数据、或大表查询的场景;
将经常使用的列作为索引;
尽量使用短索引;
如果用字符串值的列,最好使用前缀索引,防止索引值过长,前缀索引可以用来实现短索引;

索引的优势是对索引列进行了排序,不用全表查询,有查询优势;但对数据量很小的表,还有写入时,由于要改所有的索引,其实会降低写入性能;因此应该用于大表查询场景,不能用于频繁写入场景

欢迎关注我的其它发布渠道