想学习改进慢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