我们往数据表里面保存数据记录越来越多,一旦达到上千万条,那怎么提高检索速度就需要认真考虑了。我们打开手机上的APP都希望能快些加载出内容,这里的因素有很多,但是如何减少数据查找的时间是其中的重要一环。索引机制就是提升数据检索速度的,其实它的原理非常的简单,那就是对数据排序。一旦数据排序之后,查找的速度就会翻倍。举一个现实生活中的例子,我们想查找机会这个英文单词,但是我只记得开头儿是op,后面儿怎么拼写已经不记得了,如果你拿到一本儿英文词典会怎么办?快速定位到O开头儿单词的区间,小范围查找opportunity这个单词,如果英文词典里的单词都没有排序,全是乱序的,那我们可能会疯掉。查一个单词就要从词典的第一页儿翻到最后一页儿,因为你不知道哪一页儿会有opportunity这个单词出现。
把话题再收回到数据库这边,数据表中的记录都是默认按照主键来排序的,所以按照主键查找记录的速度就很快了。虽然说主键有序了,但不代表其他的字段也是有序的。比如说姓名这个字段吧,它就是乱序的。如果说按照姓名去查找员工,记录这种条件查询很频繁,那就应该给姓名字段加上索引,以便提升查找的速度,这背后的原理跟查找单词是很像的。姓王的和姓王的人排在一起,姓李的和姓李的记录排在一起,我们查找王刚这个人,那就只需要在姓王的群体里面查找就好了呀,所以这个查找就是一个小范围的查找,而不是全表查找。
创建索引有两种办法,第一种是创建数据表的时候添加上,另外一种是建表之后再添加索引,那我就先说一下建表的时候怎么去设置索引吧。
一、创建索引
1.1 创建数据表的时候添加
索引都是有名字,你规定上名字,那就用你规定的这个名字,你不规定这个名字,我就用字段的名字。那么创建一个索引之后,再往下后面儿还可以定义其他字段的索引,甚至是外界约束
咱们创建一张表儿,使用一下索引这种机制,那这张数据表儿比如说是消息通知表儿吧,那么它叫做t_message,
第一个字段是主键是ID说过了,主键最好使用int类型,因为这个数字类型比varchar类型要好很多,速度也非常的快,然后给它加上这个primary key的主键约束。
再往下就是消息的内容content,然后这个消息也不是很长,比如说要求最多200个字符,然后是必须的填写数据的是not null好了
再往下就是消息的类型type,那这个消息类型,我用一下枚举,几种类型儿,比如说是公告这种类型,然后再往下还有是通报,个人通知,不为空
再往下,还有一个消息的创建时间是create time字段,然后类型儿就时间戳吧,因为我们的这个消息肯定都是1970年之后的这个消息了,所以用这个timestamp这个时间戳儿是没有问题的
所以说,一旦这个t_message数据表里边的记录特别多的时候,如果按照类型去查找消息的记录,那这个速度可能会比较慢,但是我加上索引之后,再根据type这个字段查找记录,就非常快了,好了,那我把这个index关键字给引进来对吧,对type进行索引
CREATE TABLE t_message(
id INT UNSIGNED PRIMARY KEY,
content VARCHAR(200) NOT NULL,
type ENUM("公告","通报","个人通知") NOT NULL, # 枚举3中类型
create_time TIMESTAMP NOT NULL, # 创建时间用时间戳
INDEX inx_type(type) # 给type加上索引
);
1.2 建表之后再添加索引
如果数据表已经存在了,那么我们怎么给这个数据表儿的某个字段添加索引?
-
用到的这个语法叫做create index,写上索引的名称,然后on某一个表,某一个字段要添加索引,那你把表名和字段名称写上去就可以了。
-
还有一种给这个已经存在的表添加索引的写法,叫做alter table,然后写上表的名称add index,然后索引的名称还有是字段的名称。
这两种语法都可以对已经存在的数据表添加索引,
如果说索引加上去以后,我现在想看一下某一张数据表儿都设置了哪些索引,那么用的这个语法叫做show index from,然后写上表名,就可以查看这个数据表的所有索引了。
如果说索引我加错了,或者说这个索引我不想要了,可不可以把它删掉?可以,注意不是删除数据列,是把这个列的索引给删掉,那索引删掉以后就意味着这个索引对应的二叉树也就被删掉了,那么删除索引的语法叫做drop index,然后写上索引的名称on表名称就可以了
下面我们先删除一下刚刚创建的表的索引,然后再重新添加一下
# 删除索引
DROP INDEX inx_type ON t_message
# 重新添加索引
CREATE INDEX inx_type ON t_message(type)
# 查看索引
SHOW INDEX FROM t_message
1.3 设置索引的原则
第一个原则是针对于那些记录很多,而且经常被用来检索数据的表,我们挑选常用的检索字段作为索引,如果说数据表儿的记录很少,千800条根本不用去设置索引,就算数据库做全表儿扫描也是非常快的。因此,不用去设置索引,毕竟你设置完索引以后,数据表儿还要额外去维护二叉树,还是有一定的计算开销的,所以说数据少的时候根本就用不着去设置索引,另外,如果说数据表儿的记录虽然很多,但是数据的写入次数远远超过了查询,那么也是不适合创建索引的,比如说日志表吧,记录非常多的用户操作,但是业务上很少去查询日志表的数据,只是拿日志表作为一个行为的备案索引是提升检索速度的日志表,既然被很少查询,所以说就根本不用去设置索引了。
第二个原则,是指挑选那些常用来作为检索条件的字段去设置索引,比如说姓名,部门编号等字段都是经常拿来作为检索条件的。切记,把一张表的所有字段都去创建索引,那可真就是过犹不及了。数据库维护这么多的二叉树,计算成本还是非常高的。
第三个原则,就是不要在大字段类型上去创建索引。比如说长度超过50个字符的字符串儿就不适合设置索引了,因为字符越多,字符串排序的时间就越长,所以不建议在大字段类型上去创建索引。