我在这里得到了这个大问题:
SELECT `l`.`web_id`, `rn`.`resort_id`, `rn`.`name`,
`rn`.`address1`, `rn`.`city`, `rn`.`state`, `rn`.`postal_code`,
`rn`.`country`, `p`.`picture_name`, `p`.`picture_url`,
`ra`.`destination`, COUNT(`d`.`web_id`) AS `adsnum`
FROM `resort_name` `rn`
LEFT JOIN `location` `l` ON `rn`.`name`=`l`.`property_name`
LEFT JOIN `pictures` `p` ON `p`.`resort_id`=`rn`.`resort_id`
AND `p`.`picture_name` = (
SELECT `picture_name` FROM `pictures`
WHERE `resort_id`=`rn`.`resort_id`
ORDER BY `priority` ASC
LIMIT 1
)
LEFT JOIN `addata` `d` ON `d`.`web_id`=`l`.`web_id`
AND `d`.`caption_header`="Sale"
AND `d`.`price_desc` != "Sold"
AND `d`.`frea`="1"
LEFT JOIN `resort_attributes` `ra` ON `ra`.`resort_id`=`rn`.`resort_id`
WHERE `rn`.`name` != ""
AND `rn`.`status`="Active"
AND `rn`.`name` LIKE "%test%"
GROUP BY `rn`.`name`
ORDER BY `rn`.`name` ASC
LIMIT 0, 50
查询需要80秒以上才能运行。 解释说明结果图如下:
我相信这就是那种杀死表演的ALL。
如何正确索引表以提高性能?
感谢。
答案 0 :(得分:1)
未经测试,但你可以尝试将依赖子查询重写为连接,尽管在这种复杂程度上很难预见MySQL的优化器能否做得更好;
SELECT `l`.`web_id`, `rn`.`resort_id`, `rn`.`name`,
`rn`.`address1`, `rn`.`city`, `rn`.`state`, `rn`.`postal_code`,
`rn`.`country`, `p`.`picture_name`, `p`.`picture_url`,
`ra`.`destination`, COUNT(`d`.`web_id`) AS `adsnum`
FROM `resort_name` `rn`
LEFT JOIN `location` `l`
ON `rn`.`name`=`l`.`property_name`
LEFT JOIN `pictures` `p`
ON `p`.`resort_id`=`rn`.`resort_id`
LEFT JOIN `pictures` `p2`
ON `p2`.`resort_id`=`rn`.`resort_id`
AND `p`.priority > `p2`.`priority`
LEFT JOIN `addata` `d`
ON `d`.`web_id`=`l`.`web_id`
AND `d`.`caption_header`="Sale"
AND `d`.`price_desc` != "Sold"
AND `d`.`frea`="1"
LEFT JOIN `resort_attributes` `ra`
ON `ra`.`resort_id`=`rn`.`resort_id`
WHERE `rn`.`status`='Active'
AND `rn`.`name` LIKE '%test%'
AND `p2`.`priority` IS NULL
GROUP BY `rn`.`name`
ORDER BY `rn`.`name` ASC
LIMIT 0, 50