索引 - 普通索引 ¶
作者:KK
发表日期:2017.3.26
介绍 ¶
普通索引当然就是很普通的索引啦,普通到什么程度呢?简单地说就是没有特殊限制,主要就是允许重复的值
比如article(文章)表有个user_id字段,实际上通常来说假设有1000篇文章的话,或多或少有那么几十篇文章是同一个user_id的吧,此时为user_id创建普通索引是允许的,其它记录有相同的值也无所谓
练习测试 ¶
前提准备-创建大表 ¶
根据《构造测试数据》的指引我们按照下面的步骤准备创建一个1000000条数据记录的article表
先把储存过程里DROP TABLE的表名user改成
article
把储存过程的建表语句改成如下:
CREATE TABLE `article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(30) NOT NULL, `user_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
把储存过程的INSERT语句改成如下:
INSERT INTO `article`(`title`,`user_id`) VALUES( rand_string(20), CEIL(RAND() * 999999) );
创建储存过程
执行储存过程:
call mockData(1000000);
(我的联想笔记本大概用了2分10秒)
测试速度 ¶
刚建好这个大表,目前它只有id主键是索引,没有其它索引
由于数据是随机创建的,先通过
SELECT user_id,COUNT(user_id) as uidCount FROM article GROUP BY user_id ORDER BY uidCount DESC LIMIT 1;
查询出哪个user_id的记录数最多先,比如我这里看到结果是 120317 的记录数最多,有10条执行
SELECT * FROM article WHERE user_id = 120317;
此时user_id是没有索引的,我的结果显示用时0.19
秒准备测试带索引的速度,根据《创建/删除索引》中提到的内容重温一下创建和删除普通索引的命令:
#创建普通索引 ALTER TABLE 表名 ADD 索引名称 (字段名); #删除普通索引 ALTER TABLE 表名 DROP INDEX 索引名称;
好我们开始为user_id创建名字同样为user_id索引:
ALTER TABLE article ADD INDEX user_id(user_id);
再次执行
SELECT * FROM article WHERE user_id = 120317;
结果显示0秒就出来了,而且也能明显感知得到,刚才没有索引时像是卡了一下似的,这回一瞬间就出来了