MySQL索引

 索引是可以高效获取数据的一种机制(数据结构)。提高数据获取效率,降低数据排序的成本,提高排序效率。缺点就是降低了更新表的速度,占用空间。

1 索引分类

唯一索引

包括主键索引(指定主键时即也确定了主键索引)及唯一索引(指定唯一字段时确定,唯一字段可以是一个字段,也可以多个字段)。

普通索引

普通字段的索引。

联合索引

包括联合主键索引、联合唯一索引、联合普通索引。

全文索引

根据词条来确定位置。

空间索引

对空间数据类型的字段建立索引。(不常用)

表 索引类型

1.1 全文索引

原理:先定义一个词库,然后在文章中查找每个词条出现的频率和位置,把这样的频率和位置信息按照词库的顺序归纳。对文件建立了一个以词库为目录的索引,这样查找某个词的时候能很快定位位置。

难点:中文没有空格作为断词标识,所以很难判断一个词。而且使用的词汇在不断变化,维护一个可扩展的词汇库的成本很高。

解决:1)二元法,把所有可能的每两两汉字组合为一个词组。

2)使用词库的词作为切分的标准。

1.2 前缀索引

也叫局部索引,给某列的前部分信息添加索引。使用场景是:当字段本身可能比较长,而且前几个字符就开始能区分不同,则适合前缀索引。否则不适合前缀索引。

比如一个时间戳字段,它有13位,它表示的是从1970年1月1日00:00:00 到当前的毫秒值。对于当前表所记录的数据,这个字段前9位就能确定唯一性了。于是如果我们想为这个字段建立索引,我们只要取这个字段的前9位来建立前缀索引就行。

1.2.1 优缺点

优点:能有效减少索引文件的大小,让每个索引页可以保存更多的索引值,从而提高查询速度。

缺点:不能在order by 或者 group by 中触发前缀索引,也不能把他们用于覆盖索引。

覆盖索引:SELECT 的数据列只用从索引中就能够获取,不必读取数据行。

1.2.2 创建过程

创建原则:降低重复的索引值。

创建语法是:add index(table_name(prefix_length));

创建过程的核心在于找到合适的prefix_length值。方法如下:

不断调整prefix_length的值,直到区分度和全列的区分度相近。

全列的区分度 = count(distinct 列名) / count(*);

前缀区分度 = count(distinct left(列名,prefix_length)) / count(*);

1.3 存储形式

按照存储形式划分,索引分为聚集索引与二级索引。

1.3.1 聚集索引

又称为一级索引。一个表只能有一个聚集索引。表中数据的物理顺序与键值的逻辑(索引)顺序相同。

如果存在主键,主键索引就是聚集索引;

否则,如果存在唯一索引,则使用第一个唯一索引作为聚集索引;

否则InnoDB自动生成以rowid为键值的隐藏的聚集索引。

1.3.2 二级索引

它的data域存放的是一级索引的值,通过二级索引的data域的一级索引值,定位到一级索引来获取数据。

2 创建索引

创建索引有以下原则:

  1. 索引并非越多越好。当更新表数据时,索引也会进行调整和更新。
  2. 避免对经常更新的表创建过多的索引,并且索引中的列尽可能少,对于经常用于查询的字段应该创建索引。
  3. 数据量小的表最好不要使用索引。
  4. 在不同值较多的列上建立索引,不同值很少的列上不要创建索引。
  5. 当唯一性是某种数据本身的特质时,指定其唯一索引,能确保定义的列的数据完整性,以提高查询速度。
  6. 在频繁进行group by 或 order by 操作的列上建立索引。如果待排序的列有多个,可以建立联合索引。

创建索引:

CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name ( index_col_name,... );

查看索引:

 SHOW INDEX FROM table_name ;

删除索引

DROP INDEX index_name ON table_name ;

你可能感兴趣的:(数据库,数据库,sql,数据结构)