【问题标题】:MySQL performance using whereMySQL 性能使用 where
【发布时间】:2011-07-12 01:31:19
【问题描述】:

一个像下面这样的简单查询,在一个大约有 2M 行的表上正确索引,完成 95 rows in set (2.06 sec) 的时间比我希望的要长得多。

由于这是我第一次使用这种大小的表格,我是否正在调查正常行为

查询:

  SELECT t.id, t.symbol, t.feed, t.time, 
         FLOOR(UNIX_TIMESTAMP(t.time)/(60*15)) as diff
    FROM data as t 
   WHERE t.symbol = 'XYZ' 
     AND DATE(t.time) = '2011-06-02' 
     AND t.feed = '1M' 
GROUP BY diff  
ORDER BY t.time ASC;

...和Explain

+----+-------------+-------+------+--------------------+--------+---------+-------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys      | key    | key_len | ref   | rows   | Extra                                        |
+----+-------------+-------+------+--------------------+--------+---------+-------+--------+----------------------------------------------+
|  1 | SIMPLE      | t     | ref  | unique,feed,symbol | symbol | 1       | const | 346392 | Using where; Using temporary; Using filesort |
+----+-------------+-------+------+--------------------+--------+---------+-------+--------+----------------------------------------------+

【问题讨论】:

  • 你能同时显示你的索引和表结构吗?
  • 就正常情况而言,通常您可以设置索引以消除对文件排序的需要,通常也可以设置临时表。但是,我不是那些能做到这一点的 MySQL 向导之一:P
  • 尝试在(symbol, time, feed) 上创建密钥。也尽量不要在 where 子句中使用DATE()

标签: mysql sql query-optimization


【解决方案1】:

试试这个:

...
AND t.time >= '2011-06-02' AND t.time < '2011-06-03' 
...

否则,您的索引对于此查询是错误的。我希望(symbol, feed, time, id)(feed, symbol, time, id) 上有一个 来报道它。

在评论后编辑:

如果您将函数或处理放在列上,则任何索引都可能被忽略。索引基本上在x 而不是f(x)

此更改允许使用索引,因为我们现在使用 a &lt;= x &lt; y 来忽略时间部分,而不是 takeofftime(x)

【讨论】:

  • 95 rows in set (0.05 sec),非常出色。谢谢!你愿意解释一下为什么吗?现在要去休息了。明天将接受(还有 9 分钟允许接受)。
猜你喜欢
  • 2015-09-14
  • 2016-03-16
  • 1970-01-01
  • 2011-07-17
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2011-03-13
相关资源
最近更新 更多