私は、詳細と一緒にサービスレポートのリストを取得する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
クエリは、実際に、多数の行を持つテーブルを作成し、サービステーブルのデータと比較します。サービス番号が連続していない場合は、他の列に ' - 'を含む不足しているレポート番号が生成されます。理想的な結果が得られます。
しかし、問題は5.5.27に比較するとき、私は5.7にMySQLのバージョンをアップグレードする場合、クエリは非常にゆっくりと実行していることである(5.5.27も平均的なパフォーマンスを提供しますが、まだ使用可能。)) 5.5.27 MySQLのための経過
秒:1.48 SEC ** 5.7 MySQLのための経過 **秒:14.960 SEC
MySQL 5.7またはSQLのクエリパフォーマンスを向上させる方法についてアドバイスしてください。
注:最初の列に基づいた自動ソートが5.7で機能していないこともわかりました。これにより、クエリでオーダーを行うため、遅延が増えます。
a)Explain出力を追加してください(あなたの選択の前に 'explain 'を書いて、両方のデータベースの結果を投稿してください)。b)ノートの意味。あなたのクエリには 'order by'はありません。追加の 'order by'は、適切なインデックスがなければ、クエリを遅くすることができます。注文しないで:最初の10行(あなたが望むものにすることもできるし、5.5も速いかもしれないが、偶然に "正しい"だけ)を取る。 order by:*すべて* first、次に最初の10行を使用します。 c)索引または表の説明、およびいくつかのサンプル・データを追加します。 d)私は行番号の理由を理解していません。 – Solarflare
「ダミーテーブル」とは何ですか?そこに何行ありますか?あなたは本当にそれに 'JOIN'する必要がありますか? –
'' ORDER BY'なしで 'LIMIT'を持つのは意味がありません。 –