サーバ上でmysqlのパフォーマンスに重大な問題があります。私は非常に大きなテーブルを持っていますが、特に行数(〜900,000行)ではなく、列数(〜90列)と多くのインデックス(〜30インデックス)(これはInnodbテーブルです)を持っています。メモリ不足のMysqlパフォーマンス
私はしばらくの間、任意のクエリをしたdidntの後、私はテーブルからのカウント(*)を行うと、クエリが時間のlaaaaarge量を取ることができ、ここではショーPROCESSLISTの結果である:
| Command | Time | State | Info |
| Query | 430 | Sending data | SELECT COUNT(*) FROM CATALOG where PUBLISH = 1 and (Exclusions = 2 or Exclusions is null) |
mysql> SELECT SQL_NO_CACHE COUNT(*) FROM CATALOG where PUBLISH = 1 and (Exclusions = 2 or Exclusions is null);
+----------+
| COUNT(*) |
+----------+
| 900872 |
+----------+
1 row in set (0.66 sec)
またはキャッシュを持つ::私は後にキャッシュなしでそれをしようとすると、カウント(*)を行う、とする
ほとんど10mn
mysql> SELECT COUNT(*) FROM CATALOG where PUBLISH = 1 and (Exclusions = 2 or Exclusions is null);
+----------+
| COUNT(*) |
+----------+
| 900872 |
+----------+
1 row in set (0.00 sec)
この表のmysqlは何10mnのためにできるのですか?多分それは記憶がないのでしょうか?スワップは、サーバー上でかなりの高いです...
編集:ここSHOW CREATE TABLE
とSHOW TABLE STATUS LIKE 'CATALOG';
を提供してくださいクエリ
mysql> explain SELECT COUNT(*) FROM CATALOG where PUBLISH = 1 and (Exclusions = 2 or Exclusions is null);
+----+-------------+---------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+--------+-------------+
| 1 | SIMPLE | CATALOG | ALL | NULL | NULL | NULL | NULL | 905537 | Using where |
+----+-------------+---------+------+---------------+------+---------+------+--------+-------------+
1 row in set (0.14 sec)
count(*)はすべての列を使用します。 COUNT(1)を使用するとどうなりますか? – Random
^ええ、具体的であるかもしれません。また、あなたのインデックスがあなたのクエリにとってそれほど良いものではないかもしれません。インデックスを使用する代わりに、テーブル全体のスキャンに戻りました。 –
カウントクエリのEXPLAINを使用して、使用している可能性のある30個のインデックスのうちのどれがあるかを確認しましたか? –