2011-08-18 60 views
1

因此,我与主机提供商就技术支持问题讨论了缓慢的数据库响应问题,这是我在关键搜索页面上遇到的问题,经过一些调查后他告诉我,我正在使用的查询是检查67,998,176行。现在,此查询中出现的最大表格有至多116行,其余部分每行平均有25行。一个MySQL查询中的几个JOIN子句可以指数它必须检查的行数吗?

这里是我的查询的SQL

SELECT COUNT(DISTINCT `A`.`id`) AS `total_num_resource_rows` 
FROM `admin_site_resources` AS `A` 
LEFT JOIN `admin_site_organization_resource` AS `B` ON `B`.`res_id`=`A`.`id` 
LEFT JOIN `admin_site_organizations` AS `C` ON `B`.`org_id`=`C`.`id` 
LEFT JOIN `admin_site_resource_res_topic` AS `D` ON `D`.`resource_id`=`A`.`id` 
LEFT JOIN `admin_site_resource_topics` AS `E` ON `E`.`id`=`D`.`res_topic_id` 
LEFT JOIN `admin_site_resource_audience` AS `F` ON `F`.`resource_id`=`A`.`id` 
LEFT JOIN `admin_site_audiences` AS `G` ON `G`.`id`=`F`.`audience_id` 
LEFT JOIN `admin_site_resource_curriculum_topic` AS `H` ON `H`.`resource_id`=`A`.`id` 
LEFT JOIN `admin_site_curriculum_topics` AS `I` ON `I`.`id`=`H`.`curriculum_topic_id` 
LEFT JOIN `admin_site_resource_curriculum_grade` AS `J` ON `J`.`resource_id`=`A`.`id` 
LEFT JOIN `admin_site_curriculum_grades` AS `K` ON `K`.`id`=`J`.`curriculum_grade_id` 
LEFT JOIN `admin_site_resource_curriculum_subject` AS `L` ON `L`.`resource_id`=`A`.`id` 
LEFT JOIN `admin_site_curriculum_subjects` AS `M` ON `M`.`id`=`L`.`curriculum_subject_id` 
LEFT JOIN `admin_site_resource_res_type` AS `N` ON `N`.`resource_id`=`A`.`id` 
LEFT JOIN `admin_site_resource_types` AS `O` ON `O`.`id`=`N`.`res_type_id` 
LEFT JOIN `admin_site_resource_res_area_location` AS `P` ON `P`.`resource_id`=`A`.`id` 
LEFT JOIN `admin_site_resource_area_locations` AS `Q` ON `Q`.`id`=`P`.`res_area_location_id` 

WHERE `A`.`post_status`='approved' AND (
`A`.`resource_name` LIKE '%alpha%' 
OR `A`.`aliases` LIKE '%alpha%' 
OR `A`.`short_desc` LIKE '%alpha%' 
OR `A`.`resource_url` LIKE '%alpha%' 
OR `A`.`other_resource_type` LIKE '%alpha%' 
OR `C`.`org_name` LIKE '%alpha%' 
OR `E`.`topic_label` LIKE '%alpha%' 
OR `G`.`audience_label` LIKE '%alpha%' 
OR `I`.`topic_label` LIKE '%alpha%' 
OR `K`.`grade_label` LIKE '%alpha%' 
OR `M`.`subject_label` LIKE '%alpha%' 
OR `O`.`type_label` LIKE '%alpha%' 
OR `Q`.`area_location_label` LIKE '%alpha%'); 

是的,我明白这个查询是相当长的又丑,但我想这一切都让必须为它做了标准化的结果。我无法理解的是几行突然变成了近6,800万行。是否应该指责左连接?

+1

更多关于此的更多信息(可怕的)查询对MySQL的查询执行程序来说,您可能会尝试运行[EXPLAIN](http://dev.mysql.com/doc/refman/5.1/en/using-explain.html)。 – Steven

+0

另外,我认为你正在使用开放式结构的B/C,它不会使用任何索引。 –

+1

尝试使用'EXISTS'重写查询。 –

回答

1

重写为:

SELECT COUNT(*) AS `total_num_resource_rows` 
FROM `admin_site_resources` AS `A` 
WHERE `A`.`post_status`='approved' AND 
    (`A`.`resource_name` LIKE '%alpha%' 
    OR `A`.`aliases` LIKE '%alpha%' 
    OR `A`.`short_desc` LIKE '%alpha%' 
    OR `A`.`resource_url` LIKE '%alpha%' 
    OR `A`.`other_resource_type` LIKE '%alpha%' 
    OR EXISTS (SELECT * 
       FROM `admin_site_organization_resource` AS `B` 
       JOIN `admin_site_organizations` AS `C` 
        ON `B`.`org_id`=`C`.`id` 
       WHERE `B`.`res_id`=`A`.`id` 
       AND `C`.`org_name` LIKE '%alpha%' 
      ) 
    OR EXISTS ( 
      ... 
      ) 
    OR EXISTS ( 
      ... 
      ) 
    ... 
    ) 
2

根据每个表中有多少行与每个连接条件相匹配,最多可以有116行,第一个表与第二个表(最多13456行)最多配对116行,每个配对从第三个表格(现在1560896行)到116行,每个从第四个表格(现在为181063936行)配对多达116行...你知道这是怎么回事吗?

你可能只有在最大的表116行,但是当你把16桌密钥中的每个组合... http://en.wikipedia.org/wiki/Combination

相关问题