本文主要目的是测试单列是否应该建立索引,并以查询时间和扫描行数作为参考依据。mysql 版本 5.5.20
一:建表
- CREATE TABLE `record` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `openid` varchar(63) NOT NULL,
- `tagId` int(11) DEFAULT NULL,
- PRIMARY KEY (`id`),
- KEY `idx_openid` (`openid`) USING BTREE
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
二:插入数据
向 record 表中导入 20 万测试数据
三:测试 openid 列二值平均分布情况
(3.1)更新数据
- update record set openid = '1'where id > 0 and id <= 100000;
- update record set openid = '2'where id > 100000 and id <= 200000;
(3.2)openid 列不使用索引
(3.2.1)查询所有列
(3.2.2) 查询 tagId 列
注:rows:显示 MYSQL 估算执行查询的行数,不是精确值,简单且重要,数值越大越不好
分析:不使用索引时,大致扫描 193958 行,查询所有列查询时间为 0.230s,查询非索引单列为 0.181s。所以,尽量不要查询不需要的列。
(3.3)openid 列使用建表时的索引
分析:openid 列使用索引后,大致扫描 101132 行,查询时间 0.342s,相对于不使用索引,虽然扫描的行数变少了,但是查询时间大致增加了三分之一。因为先要在 BTree 树中查找,然后再回表查询,导致查询时间不减反增了。所以平时我们如果在性别列等二值列建立索引,是完全没有效果的。
四:建索引总结
(1)经测试,在上述 20 万数据情况下,如果 openid 列 4 值平均分布的情况下,使用索引(全列查询 0.175s)和不使用索引(全列查询 0.178s)的时间大致相当。但索引还有额外内存等消耗,如果索引对查询性能改善不大,在该列建立索引作用不大。
(2)建索引的情况下,根据索引查询出的数据越多,查询时间越长。在数据分布不均,某些索引查询条件下,查出的数据比较多时需要注意。
(3)在区分性较高的列上建索引是比较好的选择。
来源: http://www.bubuko.com/infodetail-2446270.html