2016-05-18 5 views
1

MySQLを初めて使用したとき、select count(*)またはselect count(1)はほぼ瞬間的でした。しかし、私は現在、Dreamhostでホストされているバージョン5.6.25を使用しています.12時間30秒かかる場合もあり、select count(1)を実行します。しかし、高速です。つまり、インデックスがキャッシュされているようですが、データがメタデータインデックスだけから来ているような超高速ではありません。なぜmysql select count(1)が長くかかるのですか?

何が起こっているのか、なぜ変わったのか、誰でも理解できますか?

mysql> select count(1) from times; 
+----------+ 
| count(1) | 
+----------+ 
| 1511553 | 
+----------+ 
1 row in set (22.04 sec) 

mysql> select count(1) from times; 
+----------+ 
| count(1) | 
+----------+ 
| 1512007 | 
+----------+ 
1 row in set (0.54 sec) 

mysql> select version(); 
+------------+ 
| version() | 
+------------+ 
| 5.6.25-log | 
+------------+ 
1 row in set (0.00 sec) 

mysql> 
+0

データの量はこれまでのものと似ていますか? – michaJlS

+0

前に私は10億の行を持っていました、そして、私はすべてのクエリで1秒未満の応答を得ました。 – vy32

答えて

4

私が最初に始めたのは、あなたがMyISAMを使っていて、InnoDBを使っていると思います。 InnoDBはこの情報を保存しません。ドキュメントを参照してください:同時実行トランザクションが同時に行の異なる数を「見る」可能性があるため、Limits on InnoDB Tables

InnoDBはテーブル内の行の内部カウントを保持しません。 SELECT COUNT(*)FROM t文を処理するために、InnoDBはテーブルのインデックスをスキャンします。インデックスが完全にバッファプールにない場合、時間がかかります。高速カウントを取得するには、自分で作成したカウンターテーブルを使用して、挿入や削除に応じてカウンターテーブルを更新する必要があります。おおよその行数が十分であれば、SHOW TABLE STATUSを使用できます。項9.5。「InnoDBテーブルの最適化」を参照してください。

あなたのインデックスが(遅い)最初のクエリの後に完全にバッファプール内にあるときに、2番目のクエリは、再び高速です。

MyISAMはトランザクションをサポートしていないため、同時トランザクションが作成する可能性のある問題を気にする必要がないため、select count(*) from tは検索して保存された値を非常に高速に返します。

+0

はい、それはそれを説明します。ありがとう。 – vy32

関連する問題