更新:抱歉,使用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 |
+----+-------------+------------+--------+----------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------+---------+------------------------------------------+---------+----------------------------------------------+
答案 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'
它会告诉你它正在做什么,编辑你发布的问题的结果,我们将能够更好地回答。
我能猜到它可能是对的,我可能不会