【发布时间】:2013-03-14 23:05:21
【问题描述】:
我从这个问题开始:is my large mysql table destined for failure?
我从那个问题中找到的答案是令人满意的。我有一个包含 2200 万行的表,我希望将其增加到大约 1 亿行。这时候表minute_data的结构是这样的:
我遇到的问题如下。我需要执行这个查询:
select datediff(date,now()) from minute_data where symbol = "CSCO" order by date desc limit 1;
当表包含值“CSCO”时,这非常快(
select datediff(date,now()) from minute_data where symbol = "ABCD" order by date desc limit 1;
然后查询需要很长时间......就像永远(180 秒)。
我可以解决这个问题的一种方法是在执行查询之前确保表包含我正在寻找的符号。我发现执行此操作的最快方法是使用以下查询,我只需要使用它来检查表 minute_data 是否包含我正在寻找的符号。基本上我只需要它返回一个布尔值,这样我就知道该符号是否在表中:
select count(1) from minute_data where symbol = "CSCO";
这个查询需要 30 多秒才能返回 1 个值,这对我来说太长了,因为上面的查询实际上返回了一个 datediff 计算只需要不到 1 秒。
symbol 列是 pri 键的一部分,我认为它应该能够很快找出是否存在值。
我做错了什么?有没有一种快速的方法来做我想做的事?我应该更改数据结构以优化性能吗?
谢谢!
更新
我想我找到了解决这个问题的好方法。从 LastCoder 下面的回答中,我做了以下事情:
1) 创建了一个名为minute_data_2 的新表,其定义与minute_data 完全相同。
2) ALTER TABLE minute_data_2 添加主键(符号,日期);
3) INSERT IGNORE INTO minute_data_2 SELECT * FROM minute_data;
4) DROP TABLE 分钟数据;
5) 将 minute_data_2 重命名为 minute_data
现在,我看到上面描述的相同查询的速度快得令人眼花缭乱,耗时超过 180 秒,现在在 0.001 秒内完成。太棒了。
【问题讨论】:
标签: mysql database optimization query-optimization