5

テーブルはInnoDBテーブルにあります。ここに役立つかもしれないいくつかの情報があります。

EXPLAIN SELECT COUNT(*) AS y0_ FROM db.table this_ WHERE this_.id IS NOT NULL;

+----+-------------+-------+-------+---------------+---------+---------+------+---------+--------------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows    | Extra                    |
+----+-------------+-------+-------+---------------+---------+---------+------+---------+--------------------------+
|  1 | SIMPLE      | this_ | index | PRIMARY       | PRIMARY | 8       | NULL | 4711235 | Using where; Using index |
+----+-------------+-------+-------+---------------+---------+---------+------+---------+--------------------------+
1 row in set (0.00 sec)

mysql> DESCRIBE db.table;
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id           | bigint(20)   | NO   | PRI | NULL    |       |
| id2          | varchar(28)  | YES  |     | NULL    |       |
| photo        | longblob     | YES  |     | NULL    |       |
| source       | varchar(10)  | YES  |     | NULL    |       |
| file_name    | varchar(120) | YES  |     | NULL    |       |
| file_type    | char(1)      | YES  |     | NULL    |       |
| created_date | datetime     | YES  |     | NULL    |       |
| updated_date | datetime     | YES  |     | NULL    |       |
| createdby    | varchar(50)  | YES  |     | NULL    |       |
| updatedby    | varchar(50)  | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
10 rows in set (0.05 sec)

Explainクエリは、その場で結果を表示します。しかし、実際のクエリはかなり長い間実行されています。どうすればこれを修正できますか?私は何が間違っているのですか?

photos基本的に、このテーブルにいくつあるかを把握する必要があります。当初、元のコーダーにはチェックするクエリがありましたがWHERE photo IS NOT NULL(3時間以上かかりました)、このクエリを変更して、id列が主キーであるためチェックしました。私はそこで大幅なパフォーマンスの向上を期待し、1秒以内に答えを期待していましたが、そうではないようです。

データベースでどのような種類の最適化を行う必要がありますか?クエリは問題ないと思いますが、間違っている場合は遠慮なく訂正してください。

編集:mysql Ver 14.14 Distrib 5.1.52、readline 5.1を使用したredhat-linux-gnu(x86_64)用

PS:クレイジーな理由で、テーブルの名前を変更しました。私は実際にはdbという名前のデータベースとtableという名前の問題のテーブルを持っていません。

4

1 に答える 1

12

「長い」の長さはどれくらいですか?このテーブルにはいくつの行がありますか?

MyISAMテーブルは、行数を追跡するため、単純なCOUNT(*)は常にほぼ瞬時に返されます。

一方、InnoDBの動作は異なります。つまり、InnoDBテーブルは行数を追跡しないため、COUNT(*)を実行すると、文字通り各行をカウントする必要があります。テーブルが大きい場合、これには数秒かかることがあります。

編集:COUNT(ID)の代わりに試してくださいCOUNT(*)。ここIDで、はNULLを含まないインデックス付き列です。それはより速く実行されるかもしれません。

EDIT2:ファイルのバイナリデータをlongblobに保存している場合、テーブルが大きくなり、処理速度が低下します。

可能な解決策:

  1. InnoDBの代わりにMyISAMを使用してください。
  2. おそらく挿入と削除のトリガーを使用して、独自のカウントを維持します。
  3. バイナリデータを別のテーブル、またはできれば通常のファイルに削除します。
于 2013-03-14T06:08:03.500 に答える