1

製品に特定のフィルターが適用されたすべての製品 ID を選択する MySQL クエリがあります。このクエリは機能しますが、このクエリを改善する方法を学びたいです。このクエリの代替案は、説明とともに歓迎されます。

kkx_products WHERE display = 'yes' AND id in kkx_products から kkx_products.id を選択
    (SELECT product_id FROM `kkx_filters_products` WHERE `filter_id` in
       (SELECT id FROM `kkx_filters` WHERE kkx_filters.urlname = "comics" OR kkx_filters.urlname = "comicsgraphicnovels")
    count(*) = 2 の product_id でグループ化)
    ORDER BY kkx_products.id desc LIMIT 0, 24

クエリで使用されているテーブルの構造を含めました。

説明しkkx_filtersます。

フィールド タイプ Null キー デフォルト エクストラ
id int(11) unsigned NO PRI NULL auto_increment
名前 varchar(50) NO             
filtergroup_id int(11) はい MUL NULL     
urlname varchar(50) NO MUL NULL     
date_modified タイムスタンプ NO CURRENT_TIMESTAMP    
orderid float(11,2) NO NULL    

説明しkkx_filters_productsます。

フィールド タイプ Null キー デフォルト エクストラ
filter_id int(11) いいえ PRI 0    
product_id int(11) いいえ PRI 0   

説明しkkx_productsます。

フィールド タイプ Null キー デフォルト エクストラ
id int(11) いいえ PRI NULL auto_increment
タイトル varchar(255) いいえ           
urlname varchar(50) NO MUL        
説明 ロングテキスト NO NULL   
price float(11,2) NO NULL   
orderid float(11,2) NO NULL   
imageurl varchar(255) いいえ            
date_created 日時 NO NULL    
date_modified タイムスタンプ NO CURRENT_TIMESTAMP    
created_by varchar(11) NO NULL    
modified_by varchar(11) NO NULL   
製品番号 varchar(32) NO           
instock enum('yes','no') いいえ はい    
表示列挙型('yes','no') NO はい    
4

1 に答える 1

3

条件ステートメントでインラインクエリを使用する代わりに、EXISTS ブロックを使用してみてください... http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

説明計画の違いを確認できます。以前は、結果セット内のすべてのレコードに対してクエリを実行し、そのインライン ビューの結果セット内のすべての結果に対して独自のクエリを実行していました。

ネストされたインライン ビューによって、コストが指数関数的に増加することがわかります。EXISTS はそのようには機能しません。

EXISTS の使用例:

tbl1 に列 id と data があるとします。tbl2 には列 id、parentid、および data があります。

SELECT a.*
FROM tbl1 a
WHERE 1 = 1 
AND EXISTS (
  SELECT NULL 
  FROM tbl2 b
  WHERE b.parentid = a.id 
  AND b.data = 'SOME CONDITIONAL DATA TO CONSTRAIN ON'
)

1) 1 = 1 は、すべてのレコードで true に相当する条件であると想定できます。2) EXISTS ステートメントで何を選択しても、NULL は問題ありません。3) b.parentid = a.id を確認することが重要です。これにより、exist ステートメントが結果セットにリンクされます。

于 2011-05-06T11:35:02.853 に答える