Want to learn to improve slow mysql query
I have a MySQL query to select all product id's with certain filters applied to the products. This query works but I want to learn to improve this query. Alternatives for this query are welcome with explanation.
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 
I've included the structure of the tables being used in the query.
 EXPLAIN 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
 EXPLAIN kkx_filters_products ;  
Field Type Null Key Default Extra filter_id int(11) NO PRI 0 product_id int(11) NO PRI 0
 EXPLAIN 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    
Instead of using inline queries in your criteria statements, try using the EXISTS block... http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html
You will be able to see the difference in your explain plan. Before you had a query executing for each and every record in your result set, and every result in that inline view result set had its own query executing to.
You see how nested inline views can create an exponential increase in cost. EXISTS doesn't work that way.
Example of the use of EXISTS:
Consider tbl1 has columns id and data. tbl2 has columns id, parentid, and 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) We can assume the 1 = 1 is some condition that equates to true for every record 2) Doesn't matter what we select in the EXISTS statment really, NULL is fine. 3) It is important to look at b.parentid = a.id, this links our exist statement to the result set
链接地址: http://www.djcxy.com/p/21444.html上一篇: mysql连接:什么更快?
下一篇: 想学习改进慢mysql查询
