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

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

但出于某种原因,虽然选项 1 提高了性能,但选项 2 并没有提高多少。任何想法为什么?还有其他建议吗?提前致谢。

4

1 回答 1

1

InnoDB 对大主键特别敏感,因为它使用聚集的主索引并且 aCHAR(64)会产生非常大的主键。我建议您添加一个AUTOINCREMENTid 列作为主键并提供sha256唯一索引。带有索引的那些created应该有助于全方位的表现。查找sha256会稍微慢一些,但其他一切都会更快。插入也会更快,因为数据永远不需要被sha256.

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

于 2013-04-09T21:36:56.133 回答