因此,我与主机提供商就技术支持问题讨论了缓慢的数据库响应问题,这是我在关键搜索页面上遇到的问题,经过一些调查后他告诉我,我正在使用的查询是检查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万行。是否应该指责左连接?
更多关于此的更多信息(可怕的)查询对MySQL的查询执行程序来说,您可能会尝试运行[EXPLAIN](http://dev.mysql.com/doc/refman/5.1/en/using-explain.html)。 – Steven
另外,我认为你正在使用开放式结构的B/C,它不会使用任何索引。 –
尝试使用'EXISTS'重写查询。 –