1

mysql データベースに関連する問題があります。私は Linux Web サーバー管理者で、mysql クエリの問題に直面しています。データベースは非常に小さいです。ログで追跡しようとしたところ、クエリの応答に最低 5 秒かかっていることがわかりました。サイトの最初のページはデータベースから来ています。クライアントは cms を使用しています。サーバーが一定数のヒットを取得すると、データベース サーバーの応答が非常に遅くなり、待機時間が 5 秒から数秒に増加します。

スロークエリログを確認しました

{
Query_time: 11.480138  Lock_time: 0.003837 Rows_sent: 921  Rows_examined: 3333

SET timestamp=1346656767;
SELECT `Tender`.`id`,
    `Tender`.`department_id`,
    `Tender`.`title_english`,
    `Tender`.`content_english`,
    `Tender`.`title_hindi`,
    `Tender`.`content_hindi`,
    `Tender`.`file_name`,
    `Tender`.`start_publish`,
    `Tender`.`end_publish`,
    `Tender`.`publish`,
    `Tender`.`status`,
    `Tender`.`createdBy`,
    `Tender`.`created`,
    `Tender`.`modifyBy`,
    `Tender`.`modified`
FROM `mcms_tenders` AS `Tender`
WHERE `Tender`.`department_id` IN ( 31, 33, 32, 30 );
}

ログのすべての行は同じですが、クエリ時間に違いがあります。パフォーマンスを微調整する方法はありますか?

更新:EXPLAIN結果は次のとおりです。

+----+-------------+--------+------+---------------+------+---------+------+-‌-----+-------------+
| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+--------+------+---------------+------+---------+------+----‌​--+-------------+
| 1  | SIMPLE      | Tender | ALL  | NULL          | NULL | NULL    | NULL | 3542 | Using where |
+----+-------------+--------+------+---------------+------+---------+------+----‌​--+-------------+
1 row in set, 1 warning (0.00 sec) 

クライアントはインデックスを使用していると言っているので、コマンドを実行してインデックス作成を確認します。

次の出力が得られました。インデックスを使用していることを意味しますか。

+--------------------+------------+----------+---------- --+-------------+-----------+------------+------ -+--------+------+------------+---------+ | 表 | 表 一意でない | キー名 | Seq_in_index | 列名 | 照合 | カーディナリティ | サブパート | 梱包済み | ヌル | インデックスの種類 | コメント | +--------------------+------------+----------+---------- --+-------------+-----------+-------------+----- ---+--------+------+------------+---------+ | mcms_tenders | 0 | プライマリ | 1 | ID | あ | 4264 | ヌル | ヌル | | | Bツリー| | | +--------------------+------------+----------+---------- --+-------------+-----------+-------------+----- ---+--------+------+------------+---------+

4

2 に答える 2

1

このようなクエリのパフォーマンスを微調整する通常の方法は、department_id にインデックスを作成することです。

ただし、これは、Tenders が実際にはビューではなくテーブルであることを前提としています。問題がビューにある可能性があるため、これを確認する必要があります。

また、あなたが説明したことから、問題はサーバーからエンドユーザーへの接続である可能性があります。サーバー上でローカルにクエリを実行して (またはサーバー上で厳密に実行時間をチェックして)、クエリに実際にそれほど時間がかかっているかどうかを確認します。

于 2012-09-10T14:00:09.173 に答える
0

"サーバーが一定数のヒットを取得したとき"

「いくつかの数」を定義します。データベースの使用頻度が高いほど、データベースの読み取りが遅くなることは理にかなっています。また、MySQL には、データが変更されると完全に無効化されるクエリ キャッシュがあります。したがって、誰かがこのテーブルのレコードを挿入、削除、または変更するたびに、テーブルの日付がまだキャッシュされていないため、次のクエリは遅くなります。

しかし、このようなクエリの 11 秒は非常に遅いため、負荷が高すぎるか、ハードウェアが不十分か壊れているか、データベースにインデックスがないかのいずれかです (インデックスの追加は 1 秒であると想定しているため、最初は常にこれについて言及するのを忘れています)。データベースを扱うすべての人にとって自然です)。

于 2012-09-10T09:38:15.267 に答える