在索引键vs主键上执行sql查询的性能

时间:2013-04-09 21:15:19

标签: mysql sql

我有一个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:将('created','sha256')设为主键,并在sha256上添加索引。

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

但由于某种原因,虽然选项1提高了性能,但选项2并没有提高它的性能。 有什么想法吗?还有其他建议吗?在此先感谢。

1 个答案:

答案 0 :(得分:1)

InnoDB对大型主键特别敏感,因为它使用聚簇主索引,而CHAR(64)则构成一个非常大的主键。我建议您添加AUTOINCREMENT id列作为主键,并为sha256提供唯一索引。那些以及created上的索引应该有助于提高性能。 sha256上的查找会稍微慢一些,但其他一切都会更快。插入也会更快,因为数据永远不需要被sha256的随机值移动。

我不完全确定为什么单个索引要快得多,但它可能与复合索引有很大关系,即使它是一个聚簇索引。