2017-10-11 6 views
0

私は2台のサーバで同じデータベースを持っています。MySQLクエリで新しいサーバに時間がかかりすぎる

サーバ1(クラウドサーバ4ギガバイトRAM)

MySQLの変数= https://pastebin.com/raw/jENsXnsK

これはRAM、4 GBのクラウドサーバ(管理ラックスペースからのMySQLクラウド・インスタンス)です。

iは、クエリを実行すると、複数の結合有し、それはこれが

150 rows in set (0.61 sec) 

サーバ2(専用32ギガバイトRAM)

MySQLの変数= https://pastebin.com/raw/sYdBhp4p

で実行されます32GBのRAMを備えた新しい専用サーバーまだ実稼働中ではなく、CPU/RAMを増やすにつれてクラウドサーバを専用に移行しようとしています。

クラウドサーバーからこの新しい専用の同じクエリーにDBをコピーすると、さらに時間がかかります。

150 rows in set (21.32 sec) 

これは約40倍遅くなります。専用のクラウドで

[[email protected] ~]# free -m 
       total  used  free  shared buff/cache available 
Mem:   31797  2700  23182   96  5914  28569 
Swap:   16381   0  16381 
[[email protected] ~]# 

なしSSHアクセス、アマゾンRDSのようなだけでMySQLのアクセスに無料-m上

結果。

EDIT 1:

私は、クエリは、専用のサーバー上ではるかに高速に実行したこと、2Mにデフォルト131072からjoin_buffer_sizeに変更。セットで

150行(1.84秒)

それでもそれは約4ギガバイトのRAMを搭載したサーバーよりも3倍倍遅いです。

SELECT nr.*, p.*, e.*, 
    (
     SELECT cityname as cityname 
      FROM city_type AS ct 
      where ct.id = p.city_type 
    ) as cityname, 
    (
     SELECT city_id as city_id 
      FROM tbl_suburb AS ts 
      where ts.id = e.tbl_suburb_id 
    ) as suburb_city_id, 
    (
     SELECT suburb_name 
      FROM tbl_suburb AS ts 
      where ts.id = e.tbl_suburb_id 
    ) as suburb_name, 
    (
     SELECT kilometers as km 
      FROM tbl_suburb AS tskm 
      where tskm.id = e.tbl_suburb_id 
    ) as suburb_kilometers 
    FROM new_registrations AS nr 
    INNER JOIN tbl_admin_registrations AS tar ON tar.registration_id = nr.id 
    INNER JOIN tbl_admin_properties AS tap ON tap.admin_id = tar.admin_id 
    INNER JOIN (tbl_properties AS p 
      LEFT JOIN tbl_room_types rt ON (rt.tbl_property_id = p.id) 
       ) ON p.id = tap.property_id 
    INNER JOIN tbl_expansions AS e ON e.property_id = tap.property_id 
    WHERE p.expansion = '1' 
     AND p.status = '2' 
     AND nr.country = 1 
     AND nr.id NOT IN(203, 204) 
     AND (nr.deleted = 'n' 
       OR nr.deleted IS NULL 
      ) 
     AND e.id IN (
     SELECT te.id as expansion_id 
      FROM tbl_suburb AS ts2 
      INNER JOIN tbl_expansions as te ON te.tbl_suburb_id IN (
       SELECT id 
        FROM tbl_suburb 
        WHERE city_id IN (
         SELECT id 
          FROM city_type 
          WHERE country_id = '1')) 
         )AND (
        (rt.week4 > 350 AND rt.week4 <= 5250) 
       OR (rt.week3 > 350 AND rt.week3 <= 5250) 
       OR (rt.week2 > 350 AND rt.week2 <= 5250) 
       OR (rt.week1 > 350 AND rt.week1 <= 5250)) 
    GROUP BY nr.id; 
+0

はあなたが同じクエリの計画を説明し比較したことがありますか?説明の計画は、クエリのパフォーマンスを求める最初の項目です。 –

+0

@ used-by-already私はアプリケーションの開発者ではないので、スピードアップしてもクエリを変更したくありません。私が必要とするのは、同じクエリを新しいサーバで同じ速度で実行することだけです。ここでは、クエリの説明です。 https://pastebin.com/raw/iiWKDaD7私はこれがあなたが必要とするものかどうか分かりません。もしあなたがdiffの結果を望むなら、あなたはSQLを実行するように教えてください? – HostOnNet

+0

**あなたが**計画**を比較していたかどうか尋ねました。たとえば、欠落しているインデックスが表示される可能性があります。これは、理由を絞り込むための提案です。それは私を助けません。 –

答えて

0
  • 電源を入れIN (SELECT ...)JOINに可能な限り(リンク+ prettyprintから)。私はそのようなネストされた3深く見ています。

  • 必要なIDを取得してください最初に、次に他のテーブルに参加してください。これにより、 "explode-implode"のコストがJOIN + GROUP BYから回避されます。

  • 'n'IS NULLの間で選択すると、deletedです。 ORの使用は潜在的な非効率性です。

  • :通常、列間に配列を広げるのは悪い考えです。この場合、最適化不可能なORにつながります。

  • ありjoin_buffer_sizeが小さすぎます。しかし、JOINバッファは、上記の問題のいくつかを回避するための厄介なものです。

  • すべてのJOINはいずれの方法でインデックスを使用できますか? (これは、1つEXPLAINから明らかにされていません。SHOW CREATE TABLEsを提供して下さい。)

関連する問題