データベースへのアクセスが非常に遅いのはなぜですか?

データベースへのアクセスが非常に遅いのはなぜですか?

以前は問題なく動作していたMySQLデータベースがあるのですが、起動が遅くなりました。

$> mysql -u foo bar

プロンプトが表示される前に、約 30 秒間、次の通常のメッセージが表示されます。

Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

もちろん、試してみましたが、かなり速くなります。

$> mysql -u foo bar -A

しかし、通常の起動ではなぜこんなに長く待たなければならないのでしょうか? これはそれほど大きなデータベースではありません (編集: <10 MB)。また、データは破損していないようです (起動後はすべて正常に見えます)。同時に他のクライアントが mysql サーバーに接続しておらず (コマンドで表示されるプロセスは 1 つだけshow full processlist)、すでにサービスを再起動していますmysqld

どうしたの ?

答え1

問題は、自動再ハッシュ機能

今日はこれを試してみました

mysqlプロンプトで次のように入力しました

mysql> desc outbound_

タブを2回押すと次の画面が表示されます

mysql> desc outbound_
outbound_call_id                      outbound_log.ext                      outbound_log.template_id
outbound_log                          outbound_log.failed                   outbound_log.transfer_connected
outbound_log.DealerVoiceProviderType  outbound_log.icallclick_alert         outbound_log.transfer_duration
outbound_log.VoipCallStatusType       outbound_log.isService                outbound_log.transfer_ended
outbound_log.VoipTransferStatusType   outbound_log.lead_id                  outbound_log.transfer_ext
outbound_log.call_duration            outbound_log.outbound_log_id          outbound_log.transfer_phone
outbound_log.call_ended               outbound_log.phone                    outbound_log.transfer_started
outbound_log.call_started             outbound_log.postback                 outbound_log.transfer_status
outbound_log.call_type                outbound_log.recording_url            outbound_log.vehicle_id
outbound_log.called                   outbound_log.remote_call_id           outbound_log_id
outbound_log.callnote_synced          outbound_log.sales_id
outbound_log.dealer_id                outbound_log.scheduled
mysql> desc outbound_

すべてのデータベースとテーブルが選択可能になりました

明らかに、mysql クライアントはデータベースを読み取る必要がありますinformation_schema。mysql インスタンスに InnoDB テーブルが多数含まれている場合は、データベースauto-rehashを読み取ることができるまで mysql クライアントが停止する可能性がありますinformation_schema

答え2

[mysql] に次のコードを追加すると (d で終わらないことに注意してください)、応答時間が大幅に短縮されます。

no-auto-rehash

答え3

皆さん、ありがとうございました。問題の答えが見つかりました。データベースのテーブルの 1 つにアクセスできません:

mysql> show columns from foo;
ERROR 1033 (HY000): Incorrect information in file: './db/foo.frm'

関連付けられたfoo.frmファイルは読み取れません。

$> cat foo.frm
cat: foo.frm: input/output error

ディスク障害 :/ Mysql は、そのファイルからデータにアクセスしようとするため、起動に時間がかかります。

関連情報