测试内容概述
环境:innodb表,开启innodb_file_per_table,表结构、数据量(100W+行)都相同,并且索引列a是低选择性(只有两种值,并且各占一半左右的数据)。索引:两个表中都在列a上建立索引,但表tinno2的索引中包含主键列
表tinno1的 KEY `ixa` (`a`), 表tinno2的KEY `ixai` (`a`,`id`)
测试内容:
磁盘空间:
插入性能: 分别插入10W、50W、100W行数据
查询SQL: select count(*) from 表 where a=1 and id between 100000 and 500000\G;
where条件只包含索引列和主键ID。
结论:
磁盘空间: 相同
插入性能: tinno2表略低于tinno1,但差距很小,可忽略
查询:tinno1表使用主键索引,而tinno2表使用了索引(a,id)
原因: server层并不知道innodb的索引中默认已经包含了主键列,所以tinno1表查询时没有使用索引,而使用聚集索引
详细测试内容如下
表结构:Create Table: CREATE TABLE `tinno1` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`log_dt` datetime NOT NULL,
`b` bigint(20) NOT NULL,
`c` int(11) NOT NULL,
`a` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `ixa` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Create Table: CREATE TABLE `tinno2` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`log_dt` datetime NOT NULL,
`b` bigint(20) NOT NULL,
`c` int(11) NOT NULL,
`a` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `ixai` (`a`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
数据:两个表的数据是一样,列a的数据分布如下
1 | 819585
2 | 820999
测试
磁盘空间

插入性能:表数据量相同的情况下分别插入10W、50W、100W行数据

查询性能:
表tinno1:索引ixa(`a`),不含主键ID

表tinno2:索引ixai(`a`,`id`),含主键ID
