0

私たちはクライアントのウェブサイトを管理していますが、このウェブサイトは深刻なパフォーマンスの問題を抱えています。この Web サイトは CMS 内に構築されており、同時に最大 20 人の訪問者を処理しています。Web サイトの訪問者がサイトの唯一のユーザーである限り、すべてがうまくいきます。CMS はキャッシュを構築し、mysql クエリの使用は最小限に抑えられます。

クライアントの従業員が現場で作業を開始すると、パフォーマンスが低下し始めます。ワークフロー全体がサイトを通過します。これには、データベース内のレコードの更新と新しいレコードの挿入が含まれます。レコードが更新されると、削除または挿入されたキャッシュが削除されるため、Web サイトの訪問者によるアクションがクエリにつながります。

私の最初の質問は、mysql がこれらの要求を処理できるべきかということです。データベースの設計は良くありませんが (以下を参照)。mysql でプロセスリストを見ると、単純なクエリに最大 15 秒かかっていることがわかります。これらのクエリは、更新クエリまたは挿入クエリが同時に実行されている場合にのみ、非常に時間がかかるようです。

すべてのレコードを保持している大きなテーブルの下。Web サイトのフロントエンドで使用されるすべてが、この 1 つのテーブルに格納されます。バイナリを含む。テーブルには合計 8,676 のレコードが保持されます。フロントエンドには、Variabele5 や Variabele6 などで WHERE を使用する多くのクエリがあります。これらの Variabele フィールドの値は contenttype によって異なります。

たとえば、WHERE は次のとおりです。

WHERE Variabele5 > 500 AND Variabele6 =2 AND contenttype = 35

すべての従業員が働く環境はキャッシュされません。この環境では、順序と検索のオプションを含むリストがいくつかあります。これらのクエリは可能な限り memcached に保存されますが、レコードが更新、削除、または挿入されると、memcache はクリアされます。これは、挿入、更新、および削除アクションと組み合わせて、おそらくボトルネックになります。

だから私の質問は、mysqlがこれをすべて処理できるべきか、それともデータベースの設計がリクエストを処理するのに悪いのかということです。

+------+---------------+------+-----+---- ---+----------------+
| | フィールド | フィールド タイプ | ヌル | キー | キー | デフォルト | エクストラ |
+------+---------------+------+-----+---- ---+----------------+
| | 番号 | mediumint(80) | いいえ | PRI | ヌル | auto_increment |
| | 隠れた | int(1) | いいえ | | | 0 | | |
| | タイトル | varchar(255) | いいえ | マル | | | | |
| | ボディ | テキスト | いいえ | | | ヌル | | |
| | 説明 | テキスト | いいえ | | | ヌル | | |
| | ユーザー ID | mediumint(80) | いいえ | | | 0 | | |
| | 追加 | varchar(255) | いいえ | | | ヌル | | |
| | 修正 | varchar(255) | いいえ | | | ヌル | | |
| | コンテンツタイプ | mediumint(80) | いいえ | マル | 0 | | |
| | 親| mediumint(80) | いいえ | | | 0 | | |
| | ステータス | mediumint(80) | いいえ | マル | ヌル | | |
| | コード | varchar(255) | いいえ | マル | ヌル | | |
| | メニュー | mediumint(80) | いいえ | | | ヌル | | |
| | ファイルタイプ | mediumint(80) | いいえ | | | ヌル | | |
| | フォルダ | int(11) | いいえ | | | ヌル | | |
| | 並べ替えインデックス | bigint(255) | いいえ | | | ヌル | | |
| | サーバーキャッシュ | int(1) | いいえ | | | 1 | | |
| | 将来のキャッシュ | int(1) | いいえ | | | ヌル | | |
| | パブリッシュ元 | 日付 | はい | | | ヌル | | |
| | パブリッシュまで | 日付 | はい | | | ヌル | | |
| | ピン留め | int(11) | はい | | | ヌル | | |
| | キーワード | テキスト | いいえ | | | ヌル | | |
| | 最新バージョン | int(11) | いいえ | | | ヌル | | |
| | パーマリンク | テキスト | いいえ | | | ヌル | | |
| | 整数 1 | int(12) | いいえ | | | 0 | | |
| | 整数 2 | int(4) | いいえ | | | 0 | | |
| | 整数 3 | int(4) | いいえ | | | 0 | | |
| | 整数4 | int(4) | いいえ | | | 0 | | |
| | 変数1 | varchar(255) | いいえ | | | | | | |
| | 変数2 | varchar(255) | いいえ | | | | | | |
| | 変数3 | varchar(255) | いいえ | | | | | | |
| | バリアベレ4 | varchar(255) | いいえ | | | | | | |
| | 日付1 | varchar(255) | いいえ | | | | | | |
| | 日付 2 | varchar(255) | いいえ | | | | | | |
| | テキスト 1 | テキスト | いいえ | | | ヌル | | |
| | テキスト 2 | テキスト | いいえ | | | ヌル | | |
| | テキスト 3 | テキスト | いいえ | | | ヌル | | |
| | バイナリ1 | ロングブロブ | いいえ | | | ヌル | | |
| | バイナリ 1 タイプ | varchar(255) | いいえ | | | ヌル | | |
| | バイナリ2 | ロングブロブ | いいえ | | | ヌル | | |
| | バイナリ 2 タイプ | varchar(255) | いいえ | | | ヌル | | |
| | バイナリ3 | ロングブロブ | いいえ | | | ヌル | | |
| | Binary3 タイプ | varchar(255) | いいえ | | | ヌル | | |
| | 閲覧アクセス | varchar(255) | いいえ | | | ヌル | | |
| | Binary4 | ロングブロブ | いいえ | | | ヌル | | |
| | Binary4Type | varchar(255) | いいえ | | | ヌル | | |
| | バイナリ5 | ロングブロブ | いいえ | | | ヌル | | |
| | Binary5 タイプ | varchar(255) | いいえ | | | ヌル | | |
| | バイナリ6 | ロングブロブ | いいえ | | | ヌル | | |
| | Binary6 タイプ | varchar(255) | いいえ | | | ヌル | | |
| | 整数5 | int(11) | いいえ | | | ヌル | | |
| | 整数6 | int(11) | いいえ | | | ヌル | | |
| | 変数6 | varchar(255) | いいえ | | | ヌル | | |
| | バイナリ7 | ロングブロブ | いいえ | | | ヌル | | |
| | Binary7 タイプ | varchar(255) | いいえ | | | ヌル | | |
| | バイナリ8 | ロングブロブ | いいえ | | | ヌル | | |
| | Binary8 タイプ | varchar(255) | いいえ | | | ヌル | | |
| | バイナリ9 | ロングブロブ | いいえ | | | ヌル | | |
| | Binary9 タイプ | varchar(255) | いいえ | | | ヌル | | |
| | バイナリ10 | ロングブロブ | いいえ | | | ヌル | | |
| | バイナリ10タイプ | varchar(255) | いいえ | | | ヌル | | |
| | バイナリ11 | ロングブロブ | いいえ | | | ヌル | | |
| | バイナリ11タイプ | varchar(255) | いいえ | | | ヌル | | |
| | Binary12 | ロングブロブ | いいえ | | | ヌル | | |
| | バイナリ12タイプ | varchar(255) | いいえ | | | ヌル | | |
| | Binary13 | ロングブロブ | いいえ | | | ヌル | | |
| | バイナリ13タイプ | varchar(255) | いいえ | | | ヌル | | |
| | Binary14 | ロングブロブ | いいえ | | | ヌル | | |
| | バイナリ14タイプ | varchar(255) | いいえ | | | ヌル | | |
| | Binary15 | ロングブロブ | いいえ | | | ヌル | | |
| | バイナリ15タイプ | varchar(255) | いいえ | | | ヌル | | |
| | テキスト 4 | テキスト | いいえ | | | ヌル | | |
| | テキスト 5 | テキスト | いいえ | | | ヌル | | |
| | テキスト6 | テキスト | いいえ | | | ヌル | | |
| | テキスト 7 | テキスト | いいえ | | | ヌル | | |
| | テキスト8 | テキスト | いいえ | | | ヌル | | |
| | バリアベレ5 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ7 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ8 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ9 | varchar(255) | いいえ | | | ヌル | | |
| | 変数10 | テキスト | いいえ | | | ヌル | | |
| | ヴァリアベレ11 | varchar(255) | いいえ | | | ヌル | | |
| | バリアベレ12 | varchar(255) | いいえ | | | ヌル | | |
| | バリアベレ13 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ14 | varchar(255) | いいえ | | | ヌル | | |
| | バリアベレ15 | varchar(255) | いいえ | | | ヌル | | |
| | バリアベレ16 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ17 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ18 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ19 | varchar(255) | いいえ | | | ヌル | | |
| | バリアベレ20 | varchar(255) | いいえ | | | ヌル | | |
| | バリアベレ21 | varchar(255) | いいえ | | | ヌル | | |
| | バリアベレ22 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ23 | varchar(255) | いいえ | | | ヌル | | |
| | バリアベレ24 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ25 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ26 | varchar(255) | いいえ | | | ヌル | | |
| | バリアベレ27 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ28 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ29 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ30 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ31 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ32 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ33 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ34 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ35 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ36 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ37 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ38 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ39 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ40 | varchar(255) | いいえ | | | ヌル | | |
| | バリアベレ41 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ42 | varchar(255) | いいえ | | | ヌル | | |
| | バリアベレ43 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ44 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ45 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ46 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ47 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ48 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ49 | varchar(255) | いいえ | | | ヌル | | |
| | ヴァリアベレ50 | varchar(255) | いいえ | | | ヌル | | |
+------+---------------+------+-----+---- ---+----------------+

インデックス:

+-------------+--------------+--------------+----- ------+------+
| | キー名 | Seq_in_index | 列名 | カーディナリティ | ヌル |
+-------------+--------------+--------------+----- ------+------+
| | プライマリ | 1 | 番号 | 8675 | | |
| | ステータス | 1 | ステータス | 5 | | |
| | ステータス | 2 | パブリッシュ元 | 8675 | はい |
| | ステータス | 3 | パブリッシュまで | 8675 | はい |
| | コード | 1 | コード | 4337 | | |
| | コード | 2 | タイトル | 4337 | | |
| | コンテンツタイプ | 1 | コンテンツタイプ | 30 | | |
| | タイトル | 1 | タイトル | 2891 | | |
+-------------+--------------+--------------+----- ------+------+

サーバー情報: 4x Intel(R) Xeon(R) CPU L5630 @ 2.13GHz

+---------------------------------------------------------------- --------------------------+
| | 無料 -mt |
+---------------------------------------------------------------- --------------------------+
| | キャッシュされた空き共有バッファの合計使用量 |
| | メモリ: 4096 3841 254 0 44 1223 |
| | -/+ バッファ/キャッシュ: 2573 1522 |
| | スワップ: 1023 422 601 |
| | 合計: 5119 4263 856 |
+---------------------------------------------------------------- --------------------------+

追加情報を提供する必要がある場合は、お知らせください。

編集:クエリの例

クエリはさまざまですが、いくつかの例を次に示します。

従業員の検索クエリ:

EXPLAIN SELECT profiel.nr as nr, CONCAT(profiel.title,' ',profiel.Variabele49) as naam,profiel.Variabele3 as tel, profiel.Variabele44 as huurprijs, profiel.Variabele5 as inkomen, profiel.Variabele39 as  personen, profiel.Variabele46 as perdatum, profiel.addate as inschrijving, profiel.text1 as opmerkingen, medewerker.Title as m_naam,profiel.Variabele48 as lang FROM  site_content as profiel    left join vw_activeContent as medewerker on medewerker.nr = profiel.Variabele9  WHERE  profiel.contenttype =26  AND (profiel.Status=3 OR  profiel.Text8='Nee')  AND (  profiel.nr  LIKE '%Rem%' OR  profiel.title LIKE '%Rem%' OR ' ' LIKE '%Rem%' OR  CONCAT(profiel.title,' ',profiel.Variabele49)  LIKE '%Rem%' OR profiel.Variabele49  LIKE '%Rem%' OR profiel.Variabele3  LIKE '%Rem%' OR  profiel.Variabele44  LIKE '%Rem%' OR  profiel.Variabele5  LIKE '%Rem%' OR  profiel.Variabele39  LIKE '%Rem%' OR  profiel.Variabele46  LIKE '%Rem%' OR  profiel.addate  LIKE '%Rem%' OR  profiel.text1  LIKE '%Rem%' OR  medewerker.Title  LIKE '%Rem%' OR profiel.Variabele48  LIKE '%Rem%' OR profiel.Variabele1 LIKE '%Rem%' OR profiel.Variabele3 LIKE '%Rem%' )  ORDER BY  profiel.sortIndex
+----+-------------+-------+--------------+------- ------+--------------------+---------------------- ---+---+---------+--------------------+---+------- ------+-----------------------------+-------+
| | ID | select_type | テーブル | | | タイプ | 可能な_キー | | | キー | | | key_len | 参照 | | | | | 行 | 行 エクストラ |
+----+-------------+-------+--------------+------- ------+--------------------+---------------------- ---+---+---------+--------------------+---+------- ------+-----------------------------+-------+
| | 1 | シンプル | | | プロフィール | | | 参照 | ステータス、コンテンツタイプ | コンテンツタイプ | 3 | 定数 | | | | | 1700年 | where を使用します。ファイルソートの使用 | | |
| | 1 | シンプル | | | サイトコンテンツ | eq_ref | プライマリ、ステータス | | | プライマリ | | | 3 | profile.Variabele9 | 1 | where | の使用 | | | |
+----+-------------+-------+--------------+------- ------+--------------------+---------------------- ---+---+---------+--------------------+---+------- ------+-----------------------------+-------+

検索クエリの訪問者

EXPLAIN SELECT nr, title AS adres, Description AS description, Binary3 AS bin, Variabele2 AS 
TYPE , Text3, Text2 AS verhuurd, Integer2 AS kamers, Integer3 AS personen, Variabele4 AS inclusief, Text1 AS oplevering, Integer5 AS huurpijs, Variabele6 AS wijk, moddate
FROM vw_activeContent
WHERE contenttype =22
AND Integer2 >=2
AND Integer3 >=1
AND Integer5 >380
AND Integer5 <770
ORDER BY Integer5 ASC
+----+-------------+-------+--------------+------+ ------------------+-------------+-----+-------+- ------+-----------------------------+------+---- ---+
| | ID | select_type | テーブル | | | タイプ | 可能な_キー | | | キー | | | key_len | 参照 | 行 | 行 エクストラ |
+----+-------------+-------+--------------+------+ ------------------+-------------+-----+-------+- ------+-----------------------------+------+---- ---+
| | 1 | シンプル | | | サイトコンテンツ | 参照 | ステータス、コンテンツタイプ | コンテンツタイプ | 3 | 定数 | 696 | where を使用します。ファイルソートの使用 | | | | |
+----+-------------+-------+--------------+------+ ------------------+-------------+-----+-------+- ------+-----------------------------+------+---- ---+

広く使用されているクエリ:

EXPLAIN SELECT DISTINCT Variabele2
FROM site_content
WHERE contenttype =22
AND STATUS =1
ORDER BY Variabele2 ASC
+----+-------------+-------+--------------+------+ ------------------+-------------+-----+-------+- ------+--------------------------------------------- ---+------+-------+
| | ID | select_type | テーブル | | | タイプ | 可能な_キー | | | キー | | | key_len | 参照 | 行 | 行 エクストラ |
+----+-------------+-------+--------------+------+ ------------------+-------------+-----+-------+- ------+--------------------------------------------- ---+------+-------+
| | 1 | シンプル | | | サイトコンテンツ | 参照 | ステータス、コンテンツタイプ | コンテンツタイプ | 3 | 定数 | 696 | where を使用します。一時的な使用; ファイルソートの使用 | | | | |
+----+-------------+-------+--------------+------+ ------------------+-------------+-----+-------+- ------+--------------------------------------------- ---+------+-------+
4

2 に答える 2

1

あなたが与えた唯一のクエリの例から、Variabele5とVariabele6はインデックス付けされておらず、contenttype = 35のレコードがおそらくたくさんあるので、クエリはおそらくインデックスをあまり効率的に使用していません。より多くのクエリの例は、より良い画像を取得するのに役立つ可能性があります。

ただし、テーブルサイズはそれほど大きくないように思われるため、キャッシュの実際の再構築が実際の原因である可能性があります。したがって、アプリケーションで使用されているキャッシュポリシーを確認することをお勧めします。どれだけのテストができるかわかりませんが、キャッシュをオフにしてシナリオをテストしてみます。

于 2012-12-04T09:29:23.003 に答える
0

まず、あなたが言ったように、あなたのデータベースは混乱しています。ただし、ハードウェアとデータのサイズが比較的小さいことを考えると、クエリはかなり高速であると思います。

クエリが遅い場合は、たとえば「where」基準のワイルドカードが原因である可能性がありprofiel.title LIKE '%Rem%'ます。これを全文検索に置き換えることができます。

もう1つの設計上の問題は、データベースにバイナリを保存することです。バイナリのサイズによっては、これはディスクIOのパフォーマンスに大きな影響を与える可能性があり、通常は、バイナリのエンコード/デコード(データベース接続を開いたままにする必要がある場合が多い)は、単にテキストを読み取るよりも大幅に遅くなる可能性があります。 /結果セットの数値。バイナリをファイルシステムにキャッシュすることを検討し、バイナリが変更されたことがわかっている場合にのみ、バイナリのデータベースにアクセスしてください。

ただし、データベースを掘り下げる前に、パフォーマンスの問題を突き止める方法を見つける必要があると思います。そうすれば、正しい問題を修正していることがわかります。プロファイラーを使用してボトルネックを見つけてから、特定の問題に取り組むことを検討してください。

于 2012-12-04T09:59:17.550 に答える