web-dev-qa-db-ja.com

MySQLは非常に単純なSELECTクエリで非常に遅い

InnoDBエンジンを備えたMySQL 5.5データベースにデータを保存する仮想マシンで実行されている単純なWebアプリケーションがあります。すべてが約3年間問題なく動作しましたが、突然、非常に遅くなりました。

たとえば、住所を保持する非常に単純なテーブルがあります。

CREATE TABLE `addresses` (
  `address_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) CHARACTER SET latin1 NOT NULL,
  `firstname` varchar(64) CHARACTER SET latin1 NOT NULL,
  `street` varchar(64) CHARACTER SET latin1 NOT NULL,
  `housenumber` varchar(16) CHARACTER SET latin1 NOT NULL,
  `Zip` varchar(5) CHARACTER SET latin1 NOT NULL,
  `city` varchar(64) CHARACTER SET latin1 NOT NULL,
  `email` varchar(64) CHARACTER SET latin1 NOT NULL,
  `phone` varchar(16) CHARACTER SET latin1 NOT NULL,
  `birthdate` date NOT NULL,
  PRIMARY KEY (`address_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

このテーブルには約800のエントリがありますが、実際にはそれほど多くありません。しかし、クエリを実行する

SELECT * FROM addresses

テスト目的では、決して終了しないようです。サーバー自体のmysql CLIでこれを確認しました。テーブルのいくつかの行を出力し、次の行が出力されるまで非常に長く待機します。

データ送信フェーズの問題かもしれませんが、よくわかりません。

VMには2GBのRAMがあり、使用されるのは320MBのみです。CPUも非常に低い1〜2%で実行されます。mytopは他のクエリを表示しませんIT管​​理者は、ハードウェア側で何も変更しなかったと述べました。

データベースサーバーを再起動したり、仮想マシンを再起動したりするようなことをすでに試しました。何も役に立たなかった。

編集:

EXPLAIN SELECT * FROM addresses

私にこの結果を与えます:

+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
| id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | addresses | ALL  | NULL          | NULL | NULL    | NULL |  793 |       |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)
10
tabb

CPUの負荷が低い場合は、インデックスが不足しているという問題がないことを示しています。その場合、クエリはCPUとディスクへのアクセスを増やす必要があるだけです。また、3年間は問題なく動作したとおっしゃっていました。

一般的なディスクアクセス速度(特にデータベースが配置されているパーティション)を確認しましたか?例えば。 ddここのように を使用します。あなたが説明しているものは、死んだディスクや半死んだレイドのような音です。希望するバックアップがありましたか?

13
user3648611

いくつかのことを試すことができます

  1. インデックスを設定していますか?

インデックスを作成すると、最初に全テーブルスキャンを実行せずにレコードをすばやく見つけることができ、実行時間が大幅に短縮されます。

CREATE INDEX idx_name ON addresses(name);
  1. クエリを実行する前に、最初にEXPLAINキーワードを使用します。

SELECTクエリの前で使用すると、MySQLがクエリを実行する方法と、クエリが完了する前に処理する必要がある行数が記述されます。

  1. Mysql.iniにいくつかの変更を加えます。そのVM増加RAMの場合、パフォーマンスが向上するかどうかを確認するためにmysql.iniを構成します。

あなたを導くことができる多くのMySQLオプティマイザがあります。

これが役立つ

9
Anthony Fornito