4

以下のすべてのクエリは、最大 2 分 20 秒かかる可能性がある開発サーバーで即座に実行されます。

クエリの実行時間は、ホームのあいまいな LIKE 文字列の影響を受けるようです。一致する国がほとんどない国と一致する場合は時間がかかりません。ドイツの場合は「ge」などを使用すると、実行に時間がかかります。しかし、これは常にそのようにうまくいくとは限りません。

データの送信が原因のようですが、その理由と意味は何ですか。また、本番環境のメモリはかなり少ないようです (空きメモリ)?

製品:
Intel Quad Xeon E3-1220 3.1GHz
4GB DDR3
2x 1TB SATA (RAID1)
ネットワーク速度 100Mb
Ubuntu

開発
Intel Core i3-2100、2C/4T、3.10GHz
500 GB SATA - RAID なし
4GB DDR3

このクエリは問題のクエリではありませんが、関連しているため、投稿してください。

SELECT 
    f.form_question_has_answer_id 
FROM 
    form_question_has_answer f 
INNER JOIN 
    project_company_has_user p ON f.form_question_has_answer_user_id = p.project_company_has_user_user_id 
INNER JOIN 
    company c ON p.project_company_has_user_company_id = c.company_id 
INNER JOIN 
    project p2 ON p.project_company_has_user_project_id = p2.project_id 
INNER JOIN 
    user u ON p.project_company_has_user_user_id = u.user_id 
INNER JOIN 
    form f2 ON p.project_company_has_user_project_id = f2.form_project_id 
WHERE 
    (f2.form_template_name = 'custom' AND p.project_company_has_user_garbage_collection = 0 AND p.project_company_has_user_project_id = '29') AND (LCASE(c.company_country) LIKE '%ge%' OR LCASE(c.company_country) LIKE '%abcde%') AND f.form_question_has_answer_form_id = '174'

そして、上記のクエリの説明計画は、dev と production の両方で実行すると、同じ計画が生成されます。

+----+-------------+-------+--------+----------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------+---------+----------------------------------------------------+------+-------------+
| id | select_type | table | type   | possible_keys                                                                                                                                | key                              | key_len | ref                                                | rows | Extra       |
+----+-------------+-------+--------+----------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------+---------+----------------------------------------------------+------+-------------+
|  1 | SIMPLE      | p2    | const  | PRIMARY                                                                                                                                      | PRIMARY                          | 4       | const                                              |    1 | Using index |
|  1 | SIMPLE      | f     | ref    | form_question_has_answer_form_id,form_question_has_answer_user_id                                                                            | form_question_has_answer_form_id | 4       | const                                              |  796 | Using where |
|  1 | SIMPLE      | u     | eq_ref | PRIMARY                                                                                                                                      | PRIMARY                          | 4       | new_klarents.f.form_question_has_answer_user_id    |    1 | Using index |
|  1 | SIMPLE      | p     | ref    | project_company_has_user_unique_key,project_company_has_user_user_id,project_company_has_user_company_id,project_company_has_user_project_id | project_company_has_user_user_id | 4       | new_klarents.f.form_question_has_answer_user_id    |    1 | Using where |
|  1 | SIMPLE      | f2    | ref    | form_project_id                                                                                                                              | form_project_id                  | 4       | const                                              |   15 | Using where |
|  1 | SIMPLE      | c     | eq_ref | PRIMARY                                                                                                                                      | PRIMARY                          | 4       | new_klarents.p.project_company_has_user_company_id |    1 | Using where |
+----+-------------+-------+--------+----------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------+---------+----------------------------------------------------+------+-------------+

このクエリの実行には 2 分 ~ 20 秒かかります。

サーバー上で実際に実行されているクエリは次のとおりです。

SELECT 
    COUNT(*) AS num_results 
FROM (SELECT 
        f.form_question_has_answer_id 
    FROM 
        form_question_has_answer f 
    INNER JOIN 
        project_company_has_user p ON f.form_question_has_answer_user_id = p.project_company_has_user_user_id 
    INNER JOIN 
        company c ON p.project_company_has_user_company_id = c.company_id 
    INNER JOIN 
        project p2 ON p.project_company_has_user_project_id = p2.project_id 
    INNER JOIN 
        user u ON p.project_company_has_user_user_id = u.user_id 
    INNER JOIN 
        form f2 ON p.project_company_has_user_project_id = f2.form_project_id 
    WHERE 
        (f2.form_template_name = 'custom' AND p.project_company_has_user_garbage_collection = 0 AND p.project_company_has_user_project_id = '29') AND (LCASE(c.company_country) LIKE '%ge%' OR LCASE(c.company_country) LIKE '%abcde%') AND f.form_question_has_answer_form_id = '174' 
    GROUP BY 
        f.form_question_has_answer_id;) dctrn_count_query;

計画を説明する場合 (開発と本番で同じ):

+----+-------------+-------+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------+---------+----------------------------------------------------+------+------------------------------+
    | id | select_type | table | type   | possible_keys                                                                                                                                                                            | key                              | key_len | ref                                                | rows | Extra                        |
    +----+-------------+-------+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------+---------+----------------------------------------------------+------+------------------------------+
    |  1 | PRIMARY     | NULL  | NULL   | NULL                                                                                                                                                                                     | NULL                             | NULL    | NULL                                               | NULL | Select tables optimized away |
    |  2 | DERIVED     | p2    | const  | PRIMARY                                                                                                                                                                                  | PRIMARY                          | 4       |                                                    |    1 | Using index                  |
    |  2 | DERIVED     | f     | ref    | form_question_has_answer_form_id,form_question_has_answer_user_id                                                                                                                        | form_question_has_answer_form_id | 4       |                                                    |  797 | Using where                  |
    |  2 | DERIVED     | p     | ref    | project_company_has_user_unique_key,project_company_has_user_user_id,project_company_has_user_company_id,project_company_has_user_project_id,project_company_has_user_garbage_collection | project_company_has_user_user_id | 4       | new_klarents.f.form_question_has_answer_user_id    |    1 | Using where                  |
    |  2 | DERIVED     | f2    | ref    | form_project_id                                                                                                                                                                          | form_project_id                  | 4       |                                                    |   15 | Using where                  |
    |  2 | DERIVED     | c     | eq_ref | PRIMARY                                                                                                                                                                                  | PRIMARY                          | 4       | new_klarents.p.project_company_has_user_company_id |    1 | Using where                  |
    |  2 | DERIVED     | u     | eq_ref | PRIMARY                                                                                                                                                                                  | PRIMARY                          | 4       | new_klarents.p.project_company_has_user_user_id    |    1 | Using where; Using index     |
    +----+-------------+-------+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------+---------+----------------------------------------------------+------+------------------------------+

本番サーバーで私が持っている情報は次のとおりです。

実行時:

+-------------+
| num_results |
+-------------+
|           3 |
+-------------+
1 row in set (2 min 14.28 sec)

プロフィールを表示:

+--------------------------------+------------+
| Status                         | Duration   |
+--------------------------------+------------+
| starting                       |   0.000016 |
| checking query cache for query |   0.000057 |
| Opening tables                 |   0.004388 |
| System lock                    |   0.000003 |
| Table lock                     |   0.000036 |
| init                           |   0.000030 |
| optimizing                     |   0.000016 |
| statistics                     |   0.000111 |
| preparing                      |   0.000022 |
| executing                      |   0.000004 |
| Sorting result                 |   0.000002 |
| Sending data                   | 136.213836 |
| end                            |   0.000007 |
| query end                      |   0.000002 |
| freeing items                  |   0.004273 |
| storing result in query cache  |   0.000010 |
| logging slow query             |   0.000001 |
| logging slow query             |   0.000002 |
| cleaning up                    |   0.000002 |
+--------------------------------+------------+

開発時の結果は次のとおりです。

+-------------+
| num_results |
+-------------+
|           3 |
+-------------+
1 row in set (0.08 sec)

このクエリのプロファイルは次のとおりです。

+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000022 |
| checking query cache for query | 0.000148 |
| Opening tables                 | 0.000025 |
| System lock                    | 0.000008 |
| Table lock                     | 0.000101 |
| optimizing                     | 0.000035 |
| statistics                     | 0.001019 |
| preparing                      | 0.000047 |
| executing                      | 0.000008 |
| Sorting result                 | 0.000005 |
| Sending data                   | 0.086565 |
| init                           | 0.000015 |
| optimizing                     | 0.000006 |
| executing                      | 0.000020 |
| end                            | 0.000004 |
| query end                      | 0.000004 |
| freeing items                  | 0.000028 |
| storing result in query cache  | 0.000005 |
| removing tmp table             | 0.000008 |
| closing tables                 | 0.000008 |
| logging slow query             | 0.000002 |
| cleaning up                    | 0.000005 |
+--------------------------------+----------+

ユーザーやプロジェクトの内部結合を削除すると、クエリは 30 秒に短縮されます。

私が持っている最後の情報:

Mysqlserver と Apache は同じボックスにあり、実稼働用のボックスは 1 つだけです。

上から生産量:前と後。

top - 15:43:25 up 78 days, 12:11,  4 users,  load average: 1.42, 0.99, 0.78
Tasks: 162 total,   2 running, 160 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us, 50.4%sy,  0.0%ni, 49.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4037868k total,  3772580k used,   265288k free,   243704k buffers
Swap:  3905528k total,   265384k used,  3640144k free,  1207944k cached

top - 15:44:31 up 78 days, 12:13,  4 users,  load average: 1.94, 1.23, 0.87
Tasks: 160 total,   2 running, 157 sleeping,   0 stopped,   1 zombie
Cpu(s):  0.2%us, 50.6%sy,  0.0%ni, 49.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4037868k total,  3834300k used,   203568k free,   243736k buffers
Swap:  3905528k total,   265384k used,  3640144k free,  1207804k cached

しかし、これは本番環境の通常の状態を適切に表したものではないため、クエリの実行以外で今日から取得したものをここに示します。

top - 11:04:58 up 79 days,  7:33,  4 users,  load average: 0.39, 0.58, 0.76
Tasks: 156 total,   1 running, 155 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.3%us,  2.8%sy,  0.0%ni, 93.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4037868k total,  3676136k used,   361732k free,   271480k buffers
Swap:  3905528k total,   268736k used,  3636792k free,  1063432k cached

展開:これは途中でも後でも変わりません。

top - 15:47:07 up 110 days, 22:11,  7 users,  load average: 0.17, 0.07, 0.06
Tasks: 210 total,   2 running, 208 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4111972k total,  1821100k used,  2290872k free,   238860k buffers
Swap:  4183036k total,    66472k used,  4116564k free,   921072k cached
4

7 に答える 7

1

速度が断続的に発生する場合は、サーバーの負荷またはその他のリソースの競合(この場合はメモリ)のいずれかです。システムには、すべてのインデックスを一度にメモリに格納するのに十分なRAMが必要です。そうでない場合、必要なインデックスがまだRAMにロードされていない場合は、メモリをスワップアウトする必要があります。

TOPの結果は、使用可能なRAMの量が少ないことを示しています。

innodb_buffer_pool_size設定を使用して、InnoDBのバッファープールのサイズを構成し、MyISAMのkey_buffer_sizeを構成します。RAM内のすべてのインデックスを同時に保持するのに十分な高さに設定し、システムにこれを実現するのに十分なRAMがあることを確認してください。

于 2012-05-30T15:59:26.560 に答える
0

データの送信| 136.213836

明らかに:D

これはある種のインフラストラクチャの問題である必要があります...ネットワークか何か、sql/plusターミナルからサーバーにpingを実行してみてください。そうすれば答えが得られます。

于 2012-05-30T14:16:01.400 に答える
0

私が思いつく唯一のことは、2 つの MySQL サーバーの構成の違いです。2 台のサーバーのメモリ設定に大きな違いはありますか? 仮想サーバーですか?

また、本番サーバーの負荷は非常に高いですか?

于 2012-05-30T14:41:35.537 に答える
0

通常、Explain-plan は、クエリが遅い場合に開始するのに最適な場所です。取得するには、実行します

DESCRIBE SELECT 
    COUNT(*) AS num_results 
FROM (SELECT 
        f.form_question_has_answer_id 
    FROM 
        form_question_has_answer f 
    INNER JOIN 
        project_company_has_user p ON f.form_question_has_answer_user_id = p.project_company_has_user_user_id 
    INNER JOIN 
        company c ON p.project_company_has_user_company_id = c.company_id 
    INNER JOIN 
        project p2 ON p.project_company_has_user_project_id = p2.project_id 
    INNER JOIN 
        user u ON p.project_company_has_user_user_id = u.user_id 
    INNER JOIN 
        form f2 ON p.project_company_has_user_project_id = f2.form_project_id 
    WHERE 
        (f2.form_template_name = 'custom' AND p.project_company_has_user_garbage_collection = 0 AND p.project_company_has_user_project_id = '29') AND (LCASE(c.company_country) LIKE '%finland%' OR LCASE(c.company_country) LIKE '%finnland%') AND f.form_question_has_answer_form_id = '174' 
    GROUP BY 
        f.form_question_has_answer_id;) dctrn_count_query;

これにより、クエリを実行するために必要な手順をリストした表が表示されます。「rows」列に大きな値が表示され、「key」列に NULL が表示される場合は、クエリで多数の行をスキャンして、返す行を決定する必要があることを示しています。

その場合、destination_id にインデックスを追加すると、クエリの速度が大幅に向上しますが、挿入と削除の速度がいくらか低下します (インデックスも更新する必要があるため)。

于 2012-05-30T14:19:26.090 に答える
0

開発環境と本番環境でクエリを実行し、クエリ プランを比較します。それらが異なる場合は、クエリに関係するテーブルの統計を更新してみてください。

于 2012-05-30T14:40:46.480 に答える
0

私は mysql のオプティマイザーについて詳しく知りません。

この問題は、クエリの最後に発生しています。1 つの可能性は、実稼働システムで発生している外観です。たとえば、新しいテーブルが作成されないようにする何らかのロックがメタデータにある可能性があります。

また、クエリが実行される環境もオプティマイザに影響します少なくとも、複数のスレッド/プロセッサがクエリ プランに影響を与えます。Mysql は、利用可能なリソースに基づいて、さまざまなクエリの最適化を生成できます。SQL Server は、使用可能なメモリに基づいてさまざまなクエリ プランを生成することを知っています。十分なメモリがある場合はハッシュ テーブルを使用し、使用可能なメモリが少ない場合はネストされたループ結合を使用します。メモリ割り当ては両方のシステムでまったく同じですか?

于 2012-05-30T14:42:07.817 に答える
0

このリンクが正しい場合、「データの送信」の後ろの数字は、データの送信に必要な時間ではなく、「結果の並べ替え」に必要な時間です。

これは、本番サーバーのメモリまたは CPU の問題を示唆している可能性があります。マシンの関連する統計を調べたい場合があります。

于 2012-05-30T14:30:01.273 に答える