MYSQL--创建索引

什么是索引?

索引是一张特殊的表,该表保存了主键与索引字段,并指向实体表的记录。

先假设有一张表student,表的数据有100万条数据,其中有一条数据是 name=“xiaoming”,如果要拿这条数据的话需要写的sql是

select * from student where name=‘xiaoming’
一般情况下,在没有建立索引的时候,MySQL 需要扫描全表及扫描 100 万条数据找这条数据,这个效率实际上是非常慢的,那么有什么优化方法呢?答案就是索引。

如果我在name字段上建立索引,那么 MySQL 只需要扫描一行数据及为我们找到这条name='xiaoming’的数据,是不是感觉性能提升了好多咧…

单列索引分类和创建

我们使用最常见的是单列索引,分为主键索引、普通索引和唯一索引。

1.主键索引

主键索引一般在建表时创建,不允许有空值并且值唯一,最好是与表的其他字段不相关的列或者是业务不相关的列。一般会设为 int 而且是 AUTO_INCREMENT 自增类型的,例如一般表的 id 字段。

创建主键索引一般建表时使用 primary 关键字,例如如下语句:

CREATE TABLE `student` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

2.普通索引

普通索引实际上是我们最常见的,比如上述提到的例子,我们给name增加一个普通索引如下:

CREATE INDEX name_index ON `student`(`name`);

注意这里的 ` 不是单引号,而是键盘 1 数字左边的符;

或者是:

ALTER TABLE student ADD INDEX name_index(`name`);

3.唯一索引

唯一索引和主键索引类似,要求字段唯一,但是可以允许字段为空,创建语句如下:

CREATE UNIQUE  INDEX name_index ON `student`(`name`);

唯一索引可以用来对数据进行强制性要求,可以禁止某表的某个字段出现重复数据。

什么是组合索引?

上一关卡中介绍了单列索引,很多同学可能会觉得组合索引实际上就是一个表中有多个单列索引,实际上远非看上去这么简单。

例如上节的例子中,student表有如下字段:id,name,city,score。
我们在name上和city上建立了分别的单列索引。假如这个表数据极大,我们在进行查询的时候,会有很多重名的人,比如执行以下 sql :

select * from student where name="xiaoming" and city = "北京" and score="60"

在进行查询的时候,因为有单列索引在,所以我们会先得到名字为xiaoming的一百条记录,然后在这一百条记录中查找出城市为北京的记录,最后再查找分数为 60 的记录。

这样快不快?有了单列索引,不需要扫描全表,当然快!但是,这还不够,MySQL还可以为我们提供更强大的查询效率,因为以上只会使用效率最高的一个单列索引,其余字段的索引不会生效,所以这个时候就轮到了组合索引出场。

组合索引是同时包含多个字段但是只有一个索引名称,可以直接根据组合索引查询符合字段条件的记录!

例如我们建立一个name,city,core的组合索引,可以将满足条件的记录筛选到极为有限的几条,因为如果只有单列索引的话,可能索引查出来还有上万甚至更多记录,再根据后续条件挨个筛选,一步到位的组合索引明显在性能上会快上很多。

创建组合索引

那组合索引是怎么创建,创建和查询时又有什么需要注意的地方呢?
创建示例如下:

ALTER TABLE student ADD INDEX name_city_score (name,city,score);

实际上直接创建了如下三个索引:

name
name city
name city score
查询时也会根据查询语句以上三个索引进行匹配,即查询名字或者同时查询名字城市又或者查询名字城市分数时都可以使用组合索引,但是查询城市分数等就不能使用,这是因为遵循了最左匹配原则,必须从左开始进行匹配。

猜你喜欢

转载自blog.csdn.net/qq_52297656/article/details/121075208