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;

查询的截图如下:

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

2.2唯一索引

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

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

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)

截图如下:

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

且看下面的几种情况:

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

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

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

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

就是这么简单,你学废了吗?感觉有用的话,给笔者点个赞吧 !
原文地址:https://www.cnblogs.com/zys2019/p/14713483.html