我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文主要描述mysql的索引问题,mysql不建立索引的话,所有的增删改查都是可以正常执行的,但是问题就是查询数据的时候,可能会比较慢。数据量小的时候,这个慢的影响并不明显。但是,当数据量大的时候,这个慢的问题就是不能接受的了。解决方案就是建立数据库索引。

苏南大叔:mysql数据库,如何创建单列索引和多列索引? - mysql创建索引
mysql数据库,如何创建单列索引和多列索引?(图5-1)

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔的代码所学所想。测试环境:win10mysql@5.6.27,数据表使用默认的myisam引擎。

是否需要索引

首先要强调的是:创建什么样的索引,是由select语句中的where语句所决定的。所以,建立什么样的索引并不是个拍脑袋就决定的事情,而是要深入研究业务代码,再来确定的。所以本文仅仅致力于如何建立索引,而不对建立索引的时机是否正确做出描述。

索引的建立,对于数据查询来说,是节省开销的。但是,对于数据创建和更新来说,是增加开销的。所以,这是个双刃剑。是否建立索引,建立什么字段上的索引,被建立索引的字段顺序,都是需要根据业务情况的不断发展,而进行调整的。

范例数据表

这里建立一个用户表,某个用户可以获得不同部门的权限,默认就存在一个主索引id

DROP TABLE IF EXISTS `users3`;
CREATE TABLE `users3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `department` varchar(50) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `password` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `users3` VALUES (1,'技术部','苏南大叔','11111'),(2,'国际部','苏南大叔','22222'),(3,'后勤部','sunan大叔','33333');

苏南大叔:mysql数据库,如何创建单列索引和多列索引? - 数据库
mysql数据库,如何创建单列索引和多列索引?(图5-2)

字段查询

数据查询会存在:

  • 单一字段name
  • 单一字段department
  • 组合字段name+department
select * from users3 where name='苏南大叔';
select * from users3 where department='国际部';
select * from users3 where name='苏南大叔' and department='国际部';

创建单一索引

创建索引的时候,最好是在没有数据的时候进行创建,以免发生一些意料之外的数据冲突。

create index IX_department on users3 (department asc);
create index IX_name on users3 (name asc);

否则可能会遇到一些奇怪的报错。比如字段内容重复之类的,就可能是使用了unique关键字。例如:

create unique index IX_department on users3 (department asc);
create unique index IX_name on users3 (name asc);

创建多列索引

create index IX_department_name on users3 (department asc,name asc);

对于本文来说,如果创建了IX_department_name这个多列索引,那么,就不必建立单独的namedepartment字段的索引了。针对某一列的字段(例如namedepartment)的查询,也可以命中IX_department_name这个索引。

explain检测是否命中索引

sql语句前面加上一个explain就可以查看效果。

explain select * from users3 where name='苏南大叔';
explain select * from users3 where department='国际部';
explain select * from users3 where name='苏南大叔' and department='国际部';

如果命中了索引值,那么返回值里面如下字段就不为空:possible_keys/key/key_len。如下图所示:

苏南大叔:mysql数据库,如何创建单列索引和多列索引? - explain-sql
mysql数据库,如何创建单列索引和多列索引?(图5-3)

或者使用desc,也是一样的效果。例如:

desc select * from users3 where name='苏南大叔';

查看某个表上的所有索引

show keys from users3;

苏南大叔:mysql数据库,如何创建单列索引和多列索引? - 显示所有索引
mysql数据库,如何创建单列索引和多列索引?(图5-4)

也可以通过查看建表语句,来查看所有的索引。比如:

show create table users3;

苏南大叔:mysql数据库,如何创建单列索引和多列索引? - show-create-table
mysql数据库,如何创建单列索引和多列索引?(图5-5)

删除某个索引

DROP INDEX IX_department_name ON users3;

相关链接

总结

更多mysql相关文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   mysql