想学习改进慢mysql查询

我有一个MySQL查询来选择应用于产品的某些过滤器的所有产品ID。 此查询有效,但我想学习改进此查询。 这个查询的替代方案欢迎解释。

SELECT kkx_products.id from kkx_products WHERE display = 'yes' AND id in
    (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") 
    group by product_id having count(*) = 2) 
    ORDER BY kkx_products.id desc LIMIT 0, 24 

我已经包含了查询中使用的表的结构。

kkx_filters ;

Field            Type                 Null  Key     Default        Extra
id               int(11) unsigned     NO    PRI     NULL           auto_increment
name             varchar(50)          NO             
filtergroup_id   int(11)              YES   MUL     NULL     
urlname          varchar(50)          NO    MUL     NULL     
date_modified    timestamp            NO            CURRENT_TIMESTAMP    
orderid          float(11,2)          NO            NULL    

kkx_filters_products ;

Field            Type                 Null  Key   Default          Extra
filter_id        int(11)              NO    PRI   0    
product_id       int(11)              NO    PRI   0   

kkx_products ;

Field            Type                 Null  Key   Default          Extra
id               int(11)              NO    PRI   NULL             auto_increment
title            varchar(255)         NO           
urlname          varchar(50)          NO    MUL        
description      longtext             NO          NULL   
price            float(11,2)          NO          NULL   
orderid          float(11,2)          NO          NULL   
imageurl         varchar(255)         NO            
date_created     datetime             NO          NULL    
date_modified    timestamp            NO          CURRENT_TIMESTAMP    
created_by       varchar(11)          NO          NULL    
modified_by      varchar(11)          NO          NULL   
productnumber    varchar(32)          NO           
instock          enum('yes','no')     NO          yes    
display          enum('yes','no')     NO          yes    

不要在标准语句中使用内联查询,请尝试使用EXISTS块... http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

您将能够看到解释计划中的差异。 在为结果集中的每个记录执行查询之前,该内联视图结果集中的每个结果都有自己的查询执行。

您会看到嵌套视图嵌套如何创建成本的指数增长。 EXISTS不会那样工作。

使用EXISTS的例子:

考虑tbl1有列ID和数据。 tbl2有列ID,parentid和数据。

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很重要,它将我们的存在语句链接到结果集

链接地址: http://www.djcxy.com/p/21443.html

上一篇: Want to learn to improve slow mysql query

下一篇: Unexpected behaviour of the query