SQL Query花了太长时间

时间:2016-05-25 11:40:09

标签: mysql sql query-performance

我正在使用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`

有没有办法缩短它或加快速度?

此外,是否有快速计算查询结果的方法?

2 个答案:

答案 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)而不是每行执行一次。 - 但这正是我在这种情况下默认做的,检查执行计划以获得准确的信息