2012-02-02 31 views
-2

更新:ご迷惑をおかけしますが、explainを使用した後、この質問はあまりにもローカライズされているようです。答えは、mysqlが間違ったインデックスを選択していたことです。投票を終了する。BETWEENが各クエリを個別に実行するよりも大幅に遅いのはなぜですか?

私は

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'; 

を実行していることだし、それは私が「の間に」ですなぜそれが

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'; 

などを実行するために、より高速であったであろうことを考えさせるれ、20時間以上を取っていますとても遅いです?

更新:

@loganfsmyth:日付のインデックスがあります。

@Magnus:大きなテーブルのいくつかの結合。

@Sparky:バイナリデータがありません。私はINTO OUTFILE 'filename.txt'を使用しています。

1つの日付のために戻ってこれを説明する:20+時間の走行時間で

+----+-------------+------------+--------+----------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------+---------+------------------------------------------+---------+----------------------------------------------+ 
| 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

日付の列の種類は何ですか? –

+3

'date'カラムにインデックスがありますか? – loganfsmyth

+1

そのような簡単なクエリのための20時間。どのようなモンスターテーブルがありますか? – Magnus

答えて

1

を、私はあなたが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つは使用しないのですか?

1

クエリの前にキーワードexplainを入れてください。

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

それは、それはやっているものを教えてくれますが、私たちはより良いお答えすることができます質問の結果を掲示編集します。

私は推測することができ、正しいかもしれません。

関連する問題