mysql数据库,如何创建单列索引和多列索引?
发布于 作者:苏南大叔 来源:程序如此灵动~本文主要描述mysql
的索引问题,mysql
不建立索引的话,所有的增删改查都是可以正常执行的,但是问题就是查询数据的时候,可能会比较慢。数据量小的时候,这个慢的影响并不明显。但是,当数据量大的时候,这个慢的问题就是不能接受的了。解决方案就是建立数据库索引。
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔的代码所学所想。测试环境:win10
,mysql@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');
字段查询
数据查询会存在:
- 单一字段
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
这个多列索引,那么,就不必建立单独的name
和department
字段的索引了。针对某一列的字段(例如name
或department
)的查询,也可以命中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
。如下图所示:
或者使用desc
,也是一样的效果。例如:
desc select * from users3 where name='苏南大叔';
查看某个表上的所有索引
show keys from users3;
也可以通过查看建表语句,来查看所有的索引。比如:
show create table users3;
删除某个索引
DROP INDEX IX_department_name ON users3;
相关链接
总结
更多mysql
相关文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。