下面分别创建三张表,并分别插入1W条简单的数据用来测试,详情如下:
[1] test_a 有主键但无索引
CREATE TABLE `test_a` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`content` text NOT NULL,
`number` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
[2] test_b 有主键和单列索引
CREATE TABLE `test_b` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`content` text NOT NULL,
`number` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `titleIndex` (`title`) USING BTREE,
UNIQUE KEY `numberIndex` (`number`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
[3] test_c 有主键和组合索引
CREATE TABLE `test_c` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`content` text NOT NULL,
`number` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `titleNumberIndex` (`title`,`number`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
下面按照单列索引和组合索引分别对以上三张表进行查询测试,另外下面的时间都是多次测试取的平均值。
[1] 单列索引
[1.1] 查询指定的字段
[SQL] SELECT * FROM test_a WHERE> [USE] 12ms
[SQL] SELECT * FROM test_b WHERE> [USE] [USE] 13ms
[SQL] SELECT * FROM test_b WHERE> [USE] 13ms
说明:两者用时基本一致,因此索引并未命中。
[SQL] SELECT * FROM test_a WHERE> [USE] 12ms
[SQL] SELECT * FROM test_b WHERE> [USE] [USE] 13ms
[SQL] SELECT * FROM test_b WHERE> [USE] 13ms
说明:两者用时基本一致,因此索引并未命中。
[SQL] SELECT * FROM test_a WHERE> [USE] 13ms
[SQL] SELECT * FROM test_b WHERE> [USE] [USE] 12ms
[SQL] SELECT * FROM test_b WHERE> [USE] ,>=,= 5000;
[USE] 14ms
[SQL] SELECT * FROM test_b FORCE INDEX(numberIndex) WHERE number >= 5000;
[USE] 14ms
[SQL] SELECT * FROM test_a WHERE number BETWEEN 4999 AND 5001;
[USE] 11ms
[SQL] SELECT * FROM test_b WHERE number BETWEEN 4999 AND 5001;
[USE] [USE] 13ms