1

このクエリを使用すると、すべてがうまく機能します。5 結果は 0.3587 秒。

SELECT `prod_combined`.`sku`, `prod_combined`.`titel`, `prod_combined`.`preis_vk`, 
`prod_combined`.`link` 
FROM `prod_combined` 
WHERE 
(
   prod_combined.sku IN 
       (
       SELECT 
       prod_combined.sku FROM 
       (
           SELECT prod_combined.sku FROM prod_billiger 
           INNER JOIN
           prod_combined ON prod_combined.sku = prod_billiger.sku 
           WHERE rangGesamt = 1 
           AND prod_combined.aktiv = 1 
       ) q 
       JOIN prod_combined ON prod_combined.sku = q.sku)
) 
AND (aktiv = 1)
LIMIT 0,5

しかし、このクエリを使用すると、約 3 分間実行されます。

SELECT `prod_combined`.`sku`, `prod_combined`.`titel`, `prod_combined`.`preis_vk`, 
`prod_combined`.`link` 
FROM `prod_combined` 
WHERE 
(
   prod_combined.sku IN 
       (
       SELECT 
       prod_combined.sku FROM 
       (
           SELECT prod_combined.sku FROM prod_billiger 
           INNER JOIN
           prod_combined ON prod_combined.sku = prod_billiger.sku 
           WHERE rangGesamt = 1 
           AND prod_combined.aktiv = 1 
       ) q 
       JOIN prod_combined ON prod_combined.sku = q.sku)
) 
AND (aktiv = 1)

何をしようとしているか: 最初の場所にあるすべての製品を取得します (prod_billiger.rangGesamt)。この情報は「prod_billiger」テーブルで取得します。他の製品情報は、prod_combined から取得されます。

それをスピードアップする方法はありますか?クエリ全体を考え直す必要がありますか?

よろしく、chucky2305

4

2 に答える 2

0

このようなものはあなたのために働くでしょうか?

SELECT pc.sku, pc.titel, pc.preis_vk, pc.link
FROM prod_combined AS pc 
WHERE pc.sku IN (
    SELECT sku
    FROM prod_billiger
    WHERE rangGesamt = 1
)
AND pc.aktiv=1

ステートメントをより簡潔にするために、 prod_combined ( prod_combined AS pc)の同義語を追加しました。select

テーブルが小さい場合、または rangGesamt や aktiv にインデックスがある場合、これはかなり速く実行されます。

于 2012-04-25T14:34:04.123 に答える
0

クエリを書き直すと、次のようになります。

SELECT pc.sku, pc.titel, pc.preis_vk, pc.link pc
FROM prod_combined pc   
WHERE 
(
   pc.sku IN
       (
       SELECT 
       pc2.sku FROM
       (
           SELECT pc2.sku FROM 
           prod_billiger  pb
           INNER JOIN prod_combined pc2 ON pc2.sku = pb.sku
           WHERE pb.rangGesamt = 1
           AND pc2.aktiv = 1 
       ) q 
       JOIN prod_combined pc3 ON pc3.sku = q.sku
        )
) 
AND pc.aktiv = 1
;

、これはおそらく次と同等です:

SELECT pc.sku, pc.titel, pc.preis_vk, pc.link pc
FROM prod_combined  pc
WHERE pc.sku IN (
       SELECT q.sku 
       FROM (
           SELECT pc2.sku FROM 
           prod_billiger  pb
           INNER JOIN prod_combined pc2 ON pc2.sku = pb.sku
           WHERE pb.rangGesamt = 1
           AND pc2.aktiv = 1
           ) q
        )
AND pc.aktiv = 1
        ;

これはさらに次のように削減できます。

SELECT pc.sku, pc.titel, pc.preis_vk, pc.link pc
FROM prod_combined  pc
WHERE EXISTS (
       SELECT *
          FROM prod_billiger  pb
          INNER JOIN prod_combined pc2 ON pc2.sku = pb.sku 
          WHERE pb.rangGesamt = 1 AND pc2.aktiv = 1
          AND pc.sku = pb.sku;
        )
AND pc.aktiv = 1
        ;

「sku」が prod_combined のプライマリ キーである場合、サブクエリをさらに減らして、「prod_billiger」のみを含めることができます。

SELECT pc.sku, pc.titel, pc.preis_vk, pc.link pc
FROM prod_combined  pc
WHERE EXISTS (
       SELECT *
          FROM prod_billiger  pb
          WHERE pc.sku = pb.sku;
          AND pb.rangGesamt = 1 AND pc2.aktiv = 1
        )
AND pc.aktiv = 1
        ;

これは、次のものとほぼ同等です。

SELECT pc.sku, pc.titel, pc.preis_vk, pc.link pc
FROM prod_combined  pc
WHERE pc.sku IN (
       SELECT sku
       FROM prod_billiger  pb
       WHERE pb.rangGesamt = 1 
       )
AND pc.aktiv = 1
        ;

sku が prod_billiger のプライマリ (または候補) キーでもある場合、次のようにさらに削減できます。

SELECT pc.sku, pc.titel, pc.preis_vk, pc.link pc
FROM prod_combined  pc
JOIN prod_billiger  pb ON pc.sku = pb.sku
WHERE pb.rangGesamt = 1
AND pc.aktiv = 1
        ;
于 2012-04-25T14:36:45.077 に答える