ITPub博客

首页 > 数据库 > MySQL > innodb索引末尾是否包含主键值的性能测试

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

原创 MySQL 作者:G8bao7 时间:2014-03-03 11:32:56 0 删除 编辑
版本: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


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26250550/viewspace-1098467/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 淘宝案例
请登录后发表评论 登录
全部评论

注册时间:2013-11-04

  • 博文量
    486
  • 访问量
    1187144