MySQL性能使用在哪里

Fra*_*kie 2 mysql sql query-optimization

一个简单的查询,如下面的那个,在填充了大约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;
Run Code Online (Sandbox Code Playgroud)

......和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 |
+----+-------------+-------+------+--------------------+--------+---------+-------+--------+----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 6

试试这个:

...
AND t.time >= '2011-06-02' AND t.time < '2011-06-03' 
...
Run Code Online (Sandbox Code Playgroud)

否则,此查询的索引是错误的.我期望一个(symbol, feed, time, id)(feed, symbol, time, id)掩盖它.

评论后编辑:

如果在列上放置函数或处理,则任何索引都可能被忽略.该指数基本上x没有f(x).

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