0

540 万レコードのテーブル (製品) があります。以下のクエリを使用して結果を取得しているが、動作が非常に遅い場合。より効率的なアプローチはありますか?

SELECT sd.imageid, sd.licencetype, sd.imgcollection, sd.orientation, 
       sd.pname, sd.pcaption, sd.ptype 
FROM   (SELECT imageid 
        FROM   product 
        WHERE  productkeyword IN (SELECT primary_kwd 
                                  FROM   searchkwdmgmt 
                                  WHERE  allkwd IN ( 'IPhone' )) 
        GROUP  BY imageid 
        HAVING Count(*) = 1 
        LIMIT  0, 31) q 
       JOIN searchdetails sd 
         ON sd.imageid = q.imageid 
4

3 に答える 3

1

下の列にインデックスを作成する

1.列:allkwd 表:searchkwdmgmt

2.列:imageid テーブル:searchdetails

3.カラム:imageid テーブル:product

4.節での使用を避ける

于 2013-08-10T18:59:11.273 に答える
1

サブクエリのせいでこの部分が悪い

SELECT imageid 
FROM product 
WHERE productkeyword IN (SELECT primary_kwd 
                         FROM searchkwdmgmt 
                         WHERE allkwd IN ('IPhone')) 

インデックスが正しく設定されている場合、同じクエリは同じデータを返しますが、より効率的です。

SELECT
    p.imageid 
FROM
    product as p
INNER JOIN 
    searchkwdmgmt as s ON p.productkeyword = s.primary_kwd 
WHERE 
    s.allkwd IN ('IPhone')

交換する前にまずこれをテストしてください...

于 2013-08-10T19:50:58.680 に答える
1

in古いバージョンの MySQL では、サブクエリの最適化がうまくいきません。searchkwdmgmtの各レコードに対して最大 1 つのキーワード一致があることがわかっている場合は、次のproductことができます。

SELECT sd.imageid, sd.licencetype, sd.imgcollection, sd.orientation, 
       sd.pname, sd.pcaption, sd.ptype 
FROM   (SELECT p.imageid 
        FROM product p join
             searchkwdmgmt s
             on p.productkeyword = s.primary_kwd and
                s.allkwd in ( 'IPhone' )
        GROUP  BY p.imageid 
        HAVING Count(*) = 1 
        LIMIT  0, 31
       ) q join
       searchdetails sd 
       ON sd.imageid = q.imageid ;

複数のキーワード マッチが存在する可能性がありidproduct表に がある場合は、次のことができます。

SELECT sd.imageid, sd.licencetype, sd.imgcollection, sd.orientation, 
       sd.pname, sd.pcaption, sd.ptype 
FROM   (SELECT p.imageid 
        FROM product p join
             searchkwdmgmt s
             on p.productkeyword = s.primary_kwd and
                s.allkwd in ( 'IPhone' )
        GROUP  BY p.imageid 
        HAVING Count(distinct p.productid) = 1 
        LIMIT  0, 31
       ) q join
       searchdetails sd 
       ON sd.imageid = q.imageid ;

編集:

これらのバージョンはすべて searchkwdmgmt(primary_kwd, allkwd)、 、product(productkeyword, imageid)、およびのインデックスを使用すると高速になりsearchdetails(imageid)ます。

于 2013-08-10T20:12:35.610 に答える