2016-09-02 7 views
0

部分文字列の結合を行うクエリがありますが、問題はこれが完了するのが本当に遅いということです。これを書くにはより効果的な方法がありますか?MySQLの部分文字列の結合が遅い

SELECT *, SUM(s.pris*s.antall) AS total, SUM(s.antall) AS antall 
FROM ecs_statistikk AS s 
JOIN butikk_ordre AS bo ON ordreId=bo.ecs_ordre_id AND butikkNr=bo.site_id 
JOIN ecs_supplier AS l ON SUBSTRING(s.artikkelId, 1,2)=l.lev_id 
WHERE s.salgsDato>='2016-6-01' AND s.salgsDato<='2016-09-30' 
GROUP BY l.lev_id ORDER BY total DESC 
+7

これはパフォーマンスには影響しませんが、実際には 'GROUP BY 'で' SELECT * 'を使うのは悪い習慣です。 –

+0

MySQLは関数インデックスをサポートしていないので、部分文字列なしで結合する方法を見つけることができない場合、性能は理想的ではないかもしれません。 –

+0

私はSELECT *を実行しません。ちょうどあなたが読むのが簡単だと思っただけです。 – johnohod

答えて

0

まず、インデックスを確認します。このクエリの場合:

SELECT *, SUM(s.pris*s.antall) AS total, SUM(s.antall) AS antall 
FROM ecs_statistikk s JOIN 
    butikk_ordre bo 
    ON s.ordreId = bo.ecs_ordre_id AND 
     s.butikkNr = bo.site_id JOIN 
    ecs_supplier l 
    ON SUBSTRING(s.artikkelId, 1, 2) = l.lev_id 
WHERE s.salgsDato >= '2016-06-01' AND s.salgsDato <= '2016-09-30' 
GROUP BY l.lev_id 
ORDER BY total DESC ; 

あなたはecs_statistikk(salgsDato, ordreId, butikkNr, artikkelId)butikk_ordre(ecs_ordre_id, site_id)、およびecs_supplier(lev_id) `のインデックスをしたいです。

次に、最後にJOINが必要かどうか質問します。これはあなたが望むことをしますか?

SELECT LEFT(s.artikkelId, 2) as lev_id, *, 
     SUM(s.pris*s.antall) AS total, SUM(s.antall) AS antall 
FROM ecs_statistikk s JOIN 
    butikk_ordre bo 
    ON s.ordreId = bo.ecs_ordre_id AND 
     s.butikkNr = bo.site_id 
WHERE s.salgsDato >= '2016-06-01' AND s.salgsDato <= '2016-09-30' 
GROUP BY LEFT(s.artikkelId, 2) 
ORDER BY total DESC ; 
+0

参加の必要性についての良い点。不幸にも、私はlev_idが他のテーブルにも存在するかどうかをチェックする必要があります。私は正しいインデックスを作ったと思うが、まだ40秒かかる。 – johnohod

関連する問題