2017-09-14 3 views
-2

php(Supervisor)で複数のプロセスをフォークします。それぞれが同じMysql DBへの接続を作成し、同じSELECTクエリを並列に実行します(Gearman)。プロセスの量(つまり同じ時間接続)を増やして、同じクエリを並列実行すると、各プロセスのSHOW PROCESSLISTでデータ送信時間が長くなります。トランザクションレベルがREAD COMMUNITEDでない単純な選択です。それはいくつかのMySQLの設定の問題ですか?またはSELECTクエリでテーブルのロックが発生しましたか?それとも、フルスキャンがしますか?mysqlへの接続を増やすと、同じクエリでそれぞれデータ送信時刻が上昇する

サーバー:Ubuntu 16.04.2 LTS。 1 CPUコア。 MySQL 5.7.17。 innodb_buffer_pool_size 12ギガバイト

+2

ネットワークレイテンシ、テーブル構造、インデックス、およびクエリの効率についての可能性があります。そのため、スキーマとクエリについての詳細を説明する必要があります。 – abeyaz

+0

1回の接続で3秒間実行するセルフジョイン(13個のユニークなテーブル)を含む32個のテーブルを使用しますが、2つのパラレルでは、キュー内での実行と同様に、各プロセスで6秒かかることになります。クエリは、多くの結合では十分ですが、集計やソートはありません。たった1つのテーブルスキャン4262 rows with using_whereと45%filter、他のインデックスを使用 –

+0

あなたは各クエリでテーブルをロックしているようです。 BEGIN TRANSACTIONを使用していますか? – abeyaz

答えて

0

それは詳細を参照つの接続

ガッタで3秒で実行自己ジョイン(13の一意テーブル)を含む32個のテーブルを使用します。欠落しているか不十分なインデックスのように聞こえます。

は、この「エンティティ属性値ですもしそうなら、あなたはここでのヒントに従っている:?。http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta

InnoDBはテーブルをロックしません。しかし、それはすべての行をロックしますテーブルスキャンを行うことができここでも、音。悪いインデックスなど、および/またはクエリの製剤。

全13個のテーブルのSHOW CREATE TABLE、プラスSELECTEXPLAIN SELECT ...を提供してください。

SELECTに影響を与える可能性があり、バックグラウンドで起こっている書き込みのいくつかの種類がある場合でもにモード。

少なくとも16GBのRAMですか?

どのように多くのプロセスをフォークしますか?いくつのCPUコアを持っていますか?

+0

1つのCPUコア、15GBのRAM。 2つのプロセスでも、それぞれ2回ずつ時間が増加します。 DB全体に挿入/更新アクティビティはありません。そして、はい、間違ったクエリを持っているようです。しかし、それを最適化することはできません。それをAPIで実装する必要があります。それで水平シャーディングが助けになるのですか? –

+0

おそらくCPUは実行中に100%になっていますか?それは3つを1つ説明します。生成されたクエリを変更できない場合は、シャーディングを実装することはできません。クエリを見てみましょう。 –

関連する問題