2017-06-01 12 views
1

をブロックEXISTS:MYSQLのSLEEPは内部

SELECT SLEEP(3); 

サーバは3秒間スリープします。しかし、私はこのコードを実行すると:表「のcostumers」3秒間待たずに

SELECT * FROM costumers WHERE EXISTS(SELECT SLEEP(3)); 

は、サーバーはすぐにプリントを...ちょうど指定された期間を待たずに帰国SLEEP機能についての説明がある場合、それをEXISTSブロックから呼び出されますか?同じことが、このコードでBENCHMARK機能で発生:

SELECT * FROM costumers WHERE EXISTS(SELECT BENCHMARK(100, MD5(1))) 

私はこれがより正確にSQLインジェクションの行使、ブラインドSQLインジェクションの演習で使用されているので、この特定の構造に「スリープ」機能を実行する必要があります。

また、サーバを待たせるMYSQL文を書く別の方法が分かっていると、それが役に立ちます。

+1

おそらく常に「TRUE」としてサブクエリされ、スキップされました。 – jarlh

答えて

0

私はあなたが

SELECT SLEEP(3); SELECT * FROM customers; 

コンボで立ち往生しようとしていると思います。

1

クエリオプティマイザは、が常にTRUEを返すと判断し、コードを削除します。

このクエリは眠る:

SELECT * FROM table1 WHERE EXISTS(SELECT SLEEP(3) UNION SELECT 1); 

組合は、明らかに、MySQLのオプティマイザは把握するためには複雑すぎるので、それはそれを実行します。実際には、EXPLAINをこのクエリで使用すると3秒かかります。サブクエリはテーブルに依存しないため、クエリプランを決定する際にサブクエリが実行されます。

+0

ありがとうございました:) – Yeko