2017-05-12 20 views
2

すべては、データベースがある同じマシン上で実行されます。これらのクエリは、同じことを別のやり方で行います。私はdbエンジンとしてmariadbを使用しています。なぜphpmyadminはmysqlコマンドラインよりも大幅に高速でしょうか?

クエリ1:

SELECT P.* 
FROM posts as P 
    JOIN votes AS V on P.Id=V.PostId 
    JOIN users AS U on V.UserId=U.Id 
WHERE U.Reputation >={} 
    AND P.Id NOT IN 
    (SELECT DISTINCT (P2.Id) 
    FROM posts P2, votes V2,users U2 
    WHERE P2.Id=V2.PostId 
     AND V2.UserId =U2.Id 
     AND U2.reputation < {}) 
ORDER BY P.Id; 

約3.1をとり:

SELECT p.* 
FROM users as u INNER JOIN votes ON u.Id=votes.UserId INNER JOIN posts as p ON p.Id=votes.PostId 
WHERE (SELECT MIN(u2.reputation) 
     FROM users as u2 INNER JOIN votes ON u2.Id=votes.UserId INNER JOIN posts as p2 ON p2.Id=votes.PostId 
     WHERE p2.Id=p.Id) >= {} 
ORDER BY p.Id; 

クエリー2のphpMyAdminでMySQLのコマンドラインでは約2.9秒かかり、そして0.1秒mysqlコマンドラインでは秒、phpmyadminでは0.9秒です。

これらのタイミングはすべて、クエリの実行後に自動的に表示される時間から取得されます。

なぜphpmyadminが高速になるのですか?そして、なぜphpmyadminでは速度差が大きいのですが、mysqlコマンドラインでは違いはありませんか?

+4

これらは同じデータベースで実行されていますか?多くの結果がありますか?管理ツールは 'LIMIT'節を適用しているかもしれません。 – tadman

+0

はい、私は本当にそれらが同じdbで動いていると確信しています – smurfendrek123

+0

@tadmanが示唆しているように、PHPMyAdminがパフォーマンスのためにクエリに 'LIMIT'を適用することによってデータベースから返されたレコード数を制限していることは確かです。デフォルトでは一度に25件(500件まで)しか表示されない場合、10万件のレコードは返されません。 – JNevill

答えて

4

結果がページングされ、ブラウザがクラッシュしないように、phpMyAdminのようなフロントエンドツールがLIMIT節で頻繁にステープルします。大規模なテーブル上のアプリ。何百万ものレコードを返すクエリーは、時間がかかりすぎると、より制限された方が速く実行されます。

限られたクエリと完全なクエリを比較するのは実際には公正ではありません。検索時間は大幅に異なることになります。両方のツールがすべてのレコードを取得していることを確認してください。

+1

これは、phpmyadminの1ページあたりに返されるデフォルトの行数が25であるため、mysql cliに25を渡すと、phpmyadminのmysqlコマンドラインで同じ時刻になります – smurfendrek123

0

使用しているストレージエンジンによっては、データがデータキャッシュから読み込まれていて、クエリキャッシュから読み込まれていない可能性があります。キャッシュを消去して再度クエリを実行した場合、時間差が大きすぎます。

関連する問題