2011-01-05 9 views
1

テストを問い合わせる最近、私は上司、男性のオフィスに引っ張られて、私のクエリのいずれかがシステムを遅くしていることを言われました。私はWHERE句が1 = 1で始まったからだと言われました。私のスクリプトでは、各検索語をクエリに追加していたので、1 = 1を追加して、各検索語の前にANDを追加するだけでした。結果が絞り込まれる前に、これが原因で問合せが完全な表スキャンを実行していると言われました。MySQLはWHERE句の検索時間

私はこれをテストすることにしました。約14,000レコードのuserテーブルがあります。クエリは、phpmyadminとPuTTYの両方を使用してそれぞれ5回実行されました。 phpmyadminではクエリを500に制限しましたが、PuTTYでは制限はありませんでした。私はいくつかの基本的なクエリを試し、それらの時間を計時しようとしました。私は、1 = 1が、WHERE句のまったくないクエリよりも高速にクエリを実行しているように思えました。これはライブデータベース上にありますが、結果はかなり一貫しているようでした。

私はここに投稿し、誰かが私のために結果を打破するか、私にはこれのいずれかの側のロジックを説明できるのいずれかどうかを確認するために期待していました。 alt text

+0

あなたの結果がより速い結果を示したら、それは問題ではありません、それを遅くしているデータを分析しましたか?時間を計るために何を使いましたか? – VoodooChild

+0

私はWHERE句で1 = 1を使うことについて人々がどのように考えているかを知ることがより興味があります。あなたは正しいのですが、私の結果から、それはより速く見えます。それが私を幸せにしますが、私は多分何らかの正当化を望みます。いずれのプログラムでも、クエリが実行された後、「クエリにはx秒かかる」と表示されます。私はそれで十分だろうと思った。 –

答えて

2

さて、あなたの上司、男と彼の情報源は、両方の馬鹿です。クエリに1=1を追加しても、フルテーブルスキャンは発生しません。それが行う唯一のことは、クエリの構文解析に必要な時間がそれほど長くないことです。まともなクエリプランジェネレータ(mysqlを含む)は、この条件がNOPであることを認識してドロップします。

は、私は自分のデータベース(ソーラーパネル過去のデータ)、ノイズのうち興味深い何でこれを試してみました。

mysql> select sum(KWHTODAY) from Samples where Timestamp >= '2010-01-01'; 
seconds: 5.73, 5.54, 5.65, 5.95, 5.49 
mysql> select sum(KWHTODAY) from Samples where Timestamp >= '2010-01-01' and 1=1; 
seconds: 6.01, 5.74, 5.83, 5.51, 5.83 

注意ajrealのクエリキャッシュを無効にしました。

+0

「あなたの上司と彼の情報源はどちらもばかです」 - 私はlol'd – VoodooChild

+0

それを愛しています。それを試してみてくれてありがとう。 –

1

最初に、両方のテストでset session query_cache_type=off;でしたか?第二に

、phpMyAdminはとパテ(mysqlのクライアント)の両方で、あなたのテストクエリ大きく異なる、どのように確認するためにしていますか?
両方のサイトで同じクエリを適用する必要があります。

また、あなたはphpMyAdminのは、クエリキャッシュオフであると仮定することはできません。 phpmyadminの時刻表示には、PHP処理も含まれています。この処理は避けてください。

したがって、代わりにmysqlクライアントでテストを行うだけです。

+0

それは面白いです。 'WHERE 1 = 1'クエリが節なしクエリより長くかかるように見えましたが、WHERE 1 = 1 AND 'firstName' = 'David'"と "WHERE' firstName '= 'David'" –

+0

私は両方が違いがあるとは思わない主な疑惑はクエリキャッシュをオフにしていません – ajreal

1

これは、MySQL内部で何が起こっているのかを正確に判断する方法ではありません。キャッシングやネットワークのバリエーションのようなものは、結果を歪める可能性があります。

あなたは、クエリプランMySQLはとし、= 1、あなたの1ずにクエリに使用しているものを見つけるために、「説明」を使用してになります。 DBAはこれらの結果にもっと関心を持つでしょう。また、1 = 1が完全な表スキャンを引き起こしている場合は、確実にわかります。

説明構文はここにある:http://dev.mysql.com/doc/refman/5.0/en/explain.html

結果を解釈する方法現在地:http://dev.mysql.com/doc/refman/5.0/en/explain-output.html

+0

これは非常に良い点です。私は、何が起こっているのかを見るために説明を使うことを見ていきます。私はまだ誰かが自分の経験から私のために光を当てることができると思っています。 –

+0

これらのクエリでEXPLAINを試しました。それらのすべてが「余分な」列を除いて同じ結果を持っています。 WHERE句がある場合、 "Where using"と表示されます。興味深いのは、 "EXPLAIN SELECT * FROM' user' WHERE 1 = 1 "を実行すると、WHERE句がないかのように、" Extra "カラムが空のままになります。 –

関連する問題