索引 - 普通索引

本文导航

  1. 介绍
  2. 练习测试
  • 作者:KK

  • 发表日期:2017.3.26


介绍

普通索引当然就是很普通的索引啦,普通到什么程度呢?简单地说就是没有特殊限制,主要就是允许重复的值

比如article(文章)表有个user_id字段,实际上通常来说假设有1000篇文章的话,或多或少有那么几十篇文章是同一个user_id的吧,此时为user_id创建普通索引是允许的,其它记录有相同的值也无所谓


练习测试

前提准备-创建大表

根据《构造测试数据》的指引我们按照下面的步骤准备创建一个1000000条数据记录的article表

  1. 先把储存过程里DROP TABLE的表名user改成article

  2. 把储存过程的建表语句改成如下:

    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;
    
  3. 把储存过程的INSERT语句改成如下:

    INSERT INTO `article`(`title`,`user_id`) VALUES( rand_string(20), CEIL(RAND() * 999999) );
    
  4. 创建储存过程

  5. 执行储存过程:call mockData(1000000);(我的联想笔记本大概用了2分10秒)


测试速度

刚建好这个大表,目前它只有id主键是索引,没有其它索引

  1. 由于数据是随机创建的,先通过SELECT user_id,COUNT(user_id) as uidCount FROM article GROUP BY user_id ORDER BY uidCount DESC LIMIT 1;查询出哪个user_id的记录数最多先,比如我这里看到结果是 120317 的记录数最多,有10条

  2. 执行SELECT * FROM article WHERE user_id = 120317; 此时user_id是没有索引的,我的结果显示用时0.19

  3. 准备测试带索引的速度,根据《创建/删除索引》中提到的内容重温一下创建和删除普通索引的命令:

    #创建普通索引
    ALTER TABLE 表名 ADD 索引名称 (字段名);
    
    #删除普通索引
    ALTER TABLE 表名 DROP INDEX 索引名称;
    

    好我们开始为user_id创建名字同样为user_id索引:ALTER TABLE article ADD INDEX user_id(user_id);

  4. 再次执行SELECT * FROM article WHERE user_id = 120317; 结果显示0秒就出来了,而且也能明显感知得到,刚才没有索引时像是卡了一下似的,这回一瞬间就出来了