MySQL索引

MySQL的知识还是很重要的,慢慢总结,这里先讲索引。

概述

打个比方,数据库的存取过程就跟我们写日记一样。索引就像目录,文字就是数据,时不时我们会回头看看已经写下的日记。

索引是加快查询最重要的技术,如果不适用索引的话,MySQL必须从第一条记录开始遍历整张表直到找到相关行。相应地,表如果越大,花费的时间则会越多。我们这里就先说一下索引到底是什么、怎么使用索引来改善我们的查询性能以及索引可能给我们带来的影响性能的情况。

索引的本质

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。不过实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

查询功能是数据库最基本也是最重要的功能之一,越快越好的查询性能也是大家的共同需求,借助于现在利器查询算法(比如二分查找,二叉树查找)等,数据库工程师们实现了这一目标。

每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

索引的使用

索引的存储分类

MySQL目前提供了一下四种索引:

  • B-Tree索引:最常用最常见的索引,需要深入了解
  • HASH索引:只有Memory引擎支持,使用场景简单
  • R-Tree索引:空间索引是MyISAM的一种特殊索引类型,主要用于地理空间数据类型
  • Full-text索引:全文索引也是MyISAM的一种特殊索引类型

B-Tree的索引类型

  • 普通索引: 最基本的索引类型,没有唯一性的限制
  • UNIQUE索引:表示唯一的,不允许重复的索引
  • 主键(PRIMARY KEY):唯一索引的一种,必须指定为“PRIMARY KEY”,每个表只能有一个主键,是查询速度的索引。

索引的语法

设置索引

我们可以create table是指定索引,也可以后期alter table或者create index来创建索引。

alter table三种索引均可创建

1
2
3
4
5
6
7
8
9
10
-- alter table 

-- 普通索引
alter table xxx add index index_name (column_list)

-- unique索引(必须唯一,NULL除外)
alter table xxx add unique index index_name (column_list)

-- primary key(必须唯一,且不为null)
alter table xxx add primary key (column_list)

create index只可以创建普通索引和unique索引

1
2
3
4
5
6
-- create index

-- 普通索引
create index index_name on xxx (column_list)
-- unique索引
create unique index index_name on xxx(column_list)

删除索引

drop就完事儿le

1
2
drop index index_name on xxx;
alter table xxx drop index index_name;
查看索引
1
2
show index from xxx;
show keys from xxx;
使用索引

MySQL只对<,<=,=,>,>=,between,inlike xxx%这样的查询条件生效。

索引的选择原则

  1. 较为频繁做为查询条件的字段应该设置索引(where条件 和 join条件)
  2. 唯一性太差的字段不适合做索引
  3. 更新特别频繁的字段不适合做索引
  4. 不做查询条件的字段不设置索引

索引的弊端

前文说到,索引也是一张表。于是我们更新数据的时候,同时也会更新索引,由此增加了IO量和更新索引带来的计算量,并且索引也会占空间。所以主要问题有俩

  • 更新索引带来的性能与IO消耗
  • 占用了更多的存储空间

参考

  1. MySQL-索引
  2. MySQL索引-菜鸟教程
  3. MySQL联合索引最右匹配原则