【发布时间】:2013-04-09 21:15:18
【问题描述】:
我有一个 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-tree 块中找到大量记录,这将减少磁盘读取。
但由于某种原因,虽然选项 1 提高了性能,但选项 2 并没有提高多少。 任何想法为什么?还有其他建议吗?提前致谢。
【问题讨论】:
-
这是 MyISAM 还是 InnoDB 表?
-
mysql什么时候允许你在
CREATE TABLE命令中使用{? -
@G_Nugget InnoDB。 Barmar 修正了括号
-
@fvu 我认为问题不在于无关字段的索引,而是关于在
created上放置索引而不是使(created, sha256)成为主键。 -
在
created上添加索引肯定会大大加快查询速度。第二个选项对我来说没有任何意义。