MySQL索引

1.概述

索引就是一种提高查询效率的数据结构。其优点是大大加快了数据的查询速度。缺点是索引需要消耗数据库资源,对表进行增删改时由于需要维护索引,其速度有影响。

2.索引分类

为了下面的测试方便,首先创建一个表并插入数据:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL COMMENT 用户名,
  `china_name` varchar(30) DEFAULT NULL COMMENT 中文名,
  `password` varchar(20) DEFAULT NULL COMMENT 密码,
  `id_card` varchar(20) DEFAULT NULL,
  `phone` varchar(20) DEFAULT NULL COMMENT 手机号,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_card` (`id_card`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into user values(null,zhangsan,张三,1234,19991010,15645254258),
(null,lisi,李四,1234,19970101,17545254258),
(null,zhangwu,张五,1234,19991012,13645254258),
(null,liliu,李六,1234,19990203,15648554258),
(null,zhaoliu,赵柳,1234,19990509,15475254258),
(null,lifei,李飞,1234,19970210,1564524148),
(null,zhaohong,赵虹,1234,19960315,15645254328),
(null,songqian,宋倩,1234,19970310,15645254257);

2.1主键索引

当字段被设置为主键后数据库就会自动创建索引,此列的值不能为空。此索引是在表创建时就自动创建了。

使用下面的语句查询表的索引:

show index from user;

查询的截图如下:

MySQL索引

 

 

 其中第一条就是主键的索引,索引名称是primary,索引的列名是id列。第二条是唯一索引,下面介绍。

2.2唯一索引

当字段被设置为唯一约束后数据库就会自动创建索引,此列的值是唯一的,但允许有且仅有一个NULL。此索引是在表创建时就自动创建了。

上面在创建表时,指定了身份证号码(id_card列)为唯一约束,就创建了一个索引,索引的名称就是列名:

MySQL索引

2.3普通索引

普通索引又称单值索引、单列索引,也就是一个索引值包含一列。一个表可以有多个普通索引。

假如给china_name属性添加索引,方法有两种,如下:

1)创建表时创建索引(不常用)

CREATE TABLE `user` (
    ...
  `china_name` varchar(30) DEFAULT NULL COMMENT 中文名,
   key(`china_name`)

)

这种当时不能指定索引的名称,默认是字段的名称。

2)创建表后创建索引(推荐)

语法:

create index 索引名称 on 表名(列名);

真实的sql:

create index index_user_china_name on user(china_name);

如果需要删除索引,语法如下:

drop index 索引名称 on 表名;

2.4复合索引

复合索引是一个索引包含多列。其创建方式也有两种,和单值索引类似,这里只介绍第二种方式

 下例是给username和password添加复合索引

create index index_user_username_password on user(username,password)

截图如下:

MySQL索引

 

 需要注意的是,在使用复合索引时,需要遵循最左侧原则,而且在查询过程中会动态调整字段的顺序。也就是说,在查询时,需包含创建索引时其左侧的字段作进行条件查询,才能利用索引提高效率,条件的顺序可不按照创建索引时的顺序。

且看下面的几种情况:

1)只根据username查询:可以有效利用索引提高查询效率。原因是

2)只根据password查询:不可以。原因是在创建索引时其左侧的字段是username,并未根据此条件查询。

3)根据username和password查询:可以有效利用索引提高查询效率。原因是按创建索引时顺序查询的。

4)根据password和username查询:可以有效利用索引提高查询效率。原因是包含了创建索引时其左侧的字段。虽然没按顺序,但也可以。

MySQL索引

上一篇:【mysql】mysql删除重复记录并且只保留一条


下一篇:sql server 相对应的增删改查以及表的创建及修改