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)
试试这个:
...
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)
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |