innodb索引末尾是否包含主键值的性能测试

版本:5.5.19

测试内容概述

环境: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


请使用浏览器的分享功能分享到微信等