为什么BETWEEN明显慢于单独运行每个查询?

时间:2012-02-02 22:24:53

标签: mysql sql

更新:抱歉,使用explain之后,看起来此问题太局部化了。答案是mysql选择了错误的索引。投票结束。

我跑了一份像

这样的工作
select * from some_table where sql_date = '2011-12-01';

它在30分钟内完成。

现在我正在运行

select * from some_table where sql_date BETWEEN '2011-12-01' and '2011-12-08';

并且需要20多个小时,这让我觉得运行起来会更快

select * from some_table where sql_date = '2011-12-01';
select * from some_table where sql_date = '2011-12-02';
select * from some_table where sql_date = '2011-12-03';

等。为什么'BETWEEN'这么慢?

更新

@loganfsmyth:日期上有一个索引。

@Magnus:大桌子上的几个连接。

@Sparky:没有二进制数据,我正在使用INTO OUTFILE 'filename.txt'

解释为单个日期返回:

+----+-------------+------------+--------+----------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------+---------+------------------------------------------+---------+----------------------------------------------+
| id | select_type | table      | type   | possible_keys                                                                                                  | key                                                       | key_len | ref                                      | rows    | Extra                                        |
+----+-------------+------------+--------+----------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------+---------+------------------------------------------+---------+----------------------------------------------+
|  1 | SIMPLE      | dates      | ref    | PRIMARY,index_dates_on_sql_date                                                                         | index_dates_on_sql_date                            | 3       | const                                    |       1 | Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | views      | ref    | index_views_doc_id,index_views_id | index_new_views_id | 8       | olap.dates.date_key,const         | 3241236 |                                              |
|  1 | SIMPLE      | docs       | eq_ref | PRIMARY,pub_date,published_id,user_id,user_anonymous,user_deleted                      | PRIMARY                                                   | 4       | olap.views.doc_id       |       1 | Using where                                  |
|  1 | SIMPLE      | docs_count | ref    | user_id                                                                                                   | user_id                                              | 5       | slave.docs.user_id |       1 | Using where                                  |
+----+-------------+------------+--------+----------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------+---------+------------------------------------------+---------+----------------------------------------------+

2 个答案:

答案 0 :(得分:1)

运行时间超过20小时,我怀疑你正在为BETWEEN查询进行表扫描。可能不适用于单身人士查询。

你应该问MySQL它在做什么。运行

EXPLAIN EXTENDED SELECT * FROM some_table WHERE date BETWEEN '2011-12-01' AND '2011-12-08';
EXPLAIN EXTENDED SELECT * FROM some_table WHERE date = '2011-12-01';

并比较结果。是一个使用索引而另一个不是?

答案 1 :(得分:1)

在查询之前放置关键字explain

e.g。

Explain select * from some_table where date = '2011-12-01'

它会告诉你它正在做什么,编辑你发布的问题的结果,我们将能够更好地回答。

我能猜到它可能是对的,我可能不会