我正在使用MySQL,我有一个超过30 000行的表格,我正在查询以后用于页面上的表格。 问题是查询需要超过1秒才能完成,我需要加快速度,因为网站的用户只是在不停地抱怨它。
以下是查询:
SELECT `partners`.`id`,
`partners`.`first_name`,
`partners`.`url`,
`partners`.`country`,
`partners`.`city`,
`partners`.`followers` AS `amount_of_followers`,
`partner_user_brand`.`brand_id` AS `brand`,
MAX(posts.code_start) AS code_start,
MAX(posts.code_end) AS code_end,
`partners`.`platforms`,
( SELECT sales
FROM posts
WHERE partner_id = partners.id
ORDER BY posts.code_end DESC
LIMIT 1
) AS latest_sale,
`partners`.`email`,
`partners`.`gender`,
`partner_brand_status`.`status_id`,
`partners`.`school`,
( SELECT COALESCE(SUM(sales), 0)
FROM posts
WHERE partner_id = partners.id
) AS tsales,
COALESCE(MAX(posts.sales), 0) AS best_sale,
IF(partner_user_brand.brand_id=1, RIGHT(contacted, 10), RIGHT(nv_contacted, 10)) AS last_contact
FROM `partners`
LEFT JOIN `posts`
ON `partners`.`id` = `posts`.`partner_id`
INNER JOIN `partner_user_brand`
ON `partners`.`id` = `partner_user_brand`.`partner_id`
INNER JOIN `partner_brand_status`
ON `partners`.`id` = `partner_brand_status`.`partner_id`
AND `partner_user_brand`.`brand_id` = `partner_brand_status`.`brand_id`
GROUP BY `partners`.`id`,
`partner_user_brand`.`brand_id`
有没有办法缩短它或加快速度?
此外,是否有快速计算查询结果的方法?
答案 0 :(得分:1)
您可以查看下面的内容,这对性能有帮助:
执行计划:查看您的查询执行计划。这将是绩效观点For more on execution plan
的最佳起点索引:您可以通过在要创建联接的列或where部分中的列上添加索引来提高性能。
分页:您如何提供数据同样重要。用户不会在镜头中查看3000行。因此,您可以添加分页以提高性能
重新格式化查询:除上述点外,在单个查询中删除多重选择。尝试使用联接
答案 1 :(得分:0)
select
a.*
,posts.sales as LatestSale
from (
SELECT `partners`.`id`,
`partners`.`first_name`,
`partners`.`url`,
`partners`.`country`,
`partners`.`city`,
`partners`.`followers` AS `amount_of_followers`,
`partner_user_brand`.`brand_id` AS `brand`,
MAX(posts.code_start) AS code_start,
MAX(posts.code_end) AS code_end,
`partners`.`platforms`,
`partners`.`email`,
`partners`.`gender`,
`partner_brand_status`.`status_id`,
`partners`.`school`,
SUM(posts.sales) AS tsales,
COALESCE(MAX(posts.sales), 0) AS best_sale,
IF(partner_user_brand.brand_id=1, RIGHT(contacted, 10), RIGHT(nv_contacted, 10)) AS last_contact
FROM `partners`
LEFT JOIN `posts`
ON `partners`.`id` = `posts`.`partner_id`
INNER JOIN `partner_user_brand`
ON `partners`.`id` = `partner_user_brand`.`partner_id`
INNER JOIN `partner_brand_status`
ON `partners`.`id` = `partner_brand_status`.`partner_id`
AND `partner_user_brand`.`brand_id` = `partner_brand_status`.`brand_id`
GROUP BY `partners`.`id`,
`partner_user_brand`.`brand_id`) as a
left outer join posts
on a.id = posts.partner_id
and a.code_end = posts.code_end
此可能有帮助,因为它阻止您运行查询以获取每一行的最后一次销售,而是它会执行大部分查询然后再次加入帖子以获取最新的帖子值 - 加入已为code_end列
建立的id和最新的post code_end值但是还要检查执行计划等等,如果语法有点偏离t-sql就是我的日常工作
总结思考语句的逻辑执行:如果你在主查询中的FROM之前有子查询(从..中选择值)那么那个子查询将在你的主查询之后执行,并且对于返回的每一行都执行你的主要问题。我的修改仍将首先执行主查询,然后将其加入到posts表中,但它只对所有行执行一次(afaik)而不是每行执行一次。 - 但这正是我在这种情况下默认做的,检查执行计划以获得准确的信息