码迷,mamicode.com
首页 > 数据库 > 详细

MySql系列一:建索引

时间:2017-12-31 14:11:48      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:重要   auto   简单   单列   性能   rem   prim   bubuko   区分   

本文主要目的是测试单列是否应该建立索引,并以查询时间和扫描行数作为参考依据。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)在区分性较高的列上建索引是比较好的选择。

 

MySql系列一:建索引

标签:重要   auto   简单   单列   性能   rem   prim   bubuko   区分   

原文地址:https://www.cnblogs.com/fdzfd/p/8157540.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!