0

私は、詳細と一緒にサービスレポートのリストを取得するQueryに取り組んでいます。この問合せでは、詳細列に「 - 」を入力することによって、データベースに欠落しているサービス・レポートも戻されます。それにいくつかの時間を過ごした後、私はこのようなクエリを思い付いている: -MySQL - 5.5.27から5.7へのアップグレードでのパフォーマンスの問題

select 
    22000+n as sSrn ,IFNULL(m.mType,'---') machineType, ifnull(c.custName,'---') as customerName,  IFNULL(sDos,'---') DateOfService , IFNULL(sSrgd,'---') AS ServiceRptDate ,IFNULL(sTechnician,'---') AS technician ,IFNULL(CAST(sPcdescription AS char(100)) ,'---') AS remarks , IFNULL(CAST(m.machineID AS char(100)) ,'---') AS machineID 
from 
    (
    SELECT @curRow := @curRow + 1 AS n 
    FROM  service CROSS JOIN dummytable 
    JOIN (SELECT @curRow := 0) r 
    ) numbergen 
LEFT JOIN service s ON sSrn = 22000+n 
LEFT JOIN machine m ON s.machineID = m.machineID  
LEFT JOIN customer c ON c.custID = m.custID 
LIMIT 0,10 

クエリは、実際に、多数の行を持つテーブルを作成し、サービステーブルのデータと比較します。サービス番号が連続していない場合は、他の列に ' - 'を含む不足しているレポート番号が生成されます。理想的な結果が得られます。

enter image description here

しかし、問題は5.5.27に比較するとき、私は5.7にMySQLのバージョンをアップグレードする場合、クエリは非常にゆっくりと実行していることである(5.5.27も平均的なパフォーマンスを提供しますが、まだ使用可能。)) 5.5.27 MySQLのための経過

秒:1.48 SEC ** 5.7 MySQLのための経過 enter image description here **秒:14.960 SEC enter image description here

などのために

MySQL 5.7またはSQLのクエリパフォーマンスを向上させる方法についてアドバイスしてください。

注:最初の列に基づいた自動ソートが5.7で機能していないこともわかりました。これにより、クエリでオーダーを行うため、遅延が増えます。

UPDATE: は5.5.27バージョン enter image description here

のためにEXPLAIN enter image description here

+0

a)Explain出力を追加してください(あなたの選択の前に 'explain 'を書いて、両方のデータベースの結果を投稿してください)。b)ノートの意味。あなたのクエリには 'order by'はありません。追加の 'order by'は、適切なインデックスがなければ、クエリを遅くすることができます。注文しないで:最初の10行(あなたが望むものにすることもできるし、5.5も速いかもしれないが、偶然に "正しい"だけ)を取る。 order by:*すべて* first、次に最初の10行を使用します。 c)索引または表の説明、およびいくつかのサンプル・データを追加します。 d)私は行番号の理由を理解していません。 – Solarflare

+0

「ダミーテーブル」とは何ですか?そこに何行ありますか?あなたは本当にそれに 'JOIN'する必要がありますか? –

+0

'' ORDER BY'なしで 'LIMIT'を持つのは意味がありません。 –

答えて

0

10倍の5.7バージョンのEXPLAINパフォーマンスの差は非キャッシュ対キャッシュされたようなにおいがします。各タイミングテストを2回実行します。最初のものを無視する。 (これは、クエリキャッシュをオンにしていないことを前提としています)。そうでない場合は、両方のバージョンにEXPLAIN SELECT ...を入力してください。

おそらく "シーケンス"を頻繁に使用しているので、番号1の固定テーブルを作成しないでください(大きい値)。次に、FROM numbers ... WHERE n BETWEEN 1 AND 10と言うことができます(そして、LIMITを残してください)。

MariaDBを使用している場合、その 'テーブル'は疑似テーブルseq_1_to_10で動的に生成できます。または、おそらくより良い:seq_22001_to_2201022000+を避けてください。

+0

質問をEXPLAINで更新しました。 –

関連する問題