2013-04-09 45 views
1

我有一个MySQL的InnoDB表 -性能主键

create table data (
    `sha256` CHAR(64) NOT NULL, 
    'created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    <some other fields> 
    PRIMARY KEY (`sha256`), 
) 

一个在mysqld_slow_query最慢的查询是

select * from data where created between "2013-02-01" and "2013-03-01"; 

为了提高执行力这个查询的,我有两个选项:

选项1:添加一个索引创建

选项2:创建('创建','sha256')主键,并在sha256上添加索引。

思维这里要说的是,当我们选择了大量的行,如在一个月内收集到的数据,我想,以减少被访问的B树块的数量。如果我们通过索引访问这些记录(选项1),我们仍然最终可能会为每条记录访问不同的块。相反,如果我们将按时间戳排序的记录存储为主键/聚簇键(选项2),我们将在同一个B树块中找到大量记录,这会减少磁盘读取。

但由于某些原因,而选择1提高了性能,选择2并不能改善它一样多。 任何想法为什么?还有其他建议吗?提前致谢。因为它使用集群主索引和一个CHAR(64)使一个非常大的主键

+0

这是一个MyISAM或InnoDB表? – 2013-04-09 21:17:07

+0

从什么时候mysql允许你在'CREATE TABLE'命令中使用''''? – Barmar 2013-04-09 21:17:51

+0

@G_Nugget InnoDB。 Barmar固定括号 – 2013-04-09 21:25:42

回答

1

InnoDB的是大主键特别敏感。我建议你添加一个AUTOINCREMENT id列作为主键并给sha256一个唯一索引。那些与created索引一起应该有助于全方位的表现。在sha256上的查找会稍微慢一点,但其他一切都会更快。插入也将更快,因为数据将永远不需要被随机值sha256左右移动。

我不完全知道为什么单项指标本来要快得多,但它可能与该指数是如此之大,即使它是一个聚集索引的事情。

+0

是的,我知道主键CHAR(64)是一个糟糕的主意,对于临时性,我会使用HEX或char的子集(64) 。但这是一个单独的问题。问题是 - 为什么索引('created')比主键('created')更好,这个特定的查询会返回大量的行。 – 2013-04-09 23:18:07