sql查询需要时间,因为我正在查看三个表
Posted
技术标签:
【中文标题】sql查询需要时间,因为我正在查看三个表【英文标题】:sql query taking time, as i am looking into three tables 【发布时间】:2013-10-01 11:15:09 【问题描述】:我正在执行这个查询,结果很好,但问题是它花费了太长时间,有人可以告诉我如何提高效率(SQL 显示这个查询需要 2.8 秒,但实际上它需要超过10 秒)起初我在 3 个表上使用连接,但该查询比这个查询花费更多时间。 提前致谢。
SELECT
ee_expert.expert_id ,
AVG( ee_expert_rating.rating_stars ) AS total_rating,
ee_expert.expert_id,
COUNT( DISTINCT ee_expert_rating.rating_id ) AS rating_count
FROM
ee_expert_rating
RIGHT JOIN ee_expert
ON ee_expert.expert_id = ee_expert_rating.expert_id
WHERE
expert_verified_email =2
AND expert_brief_description != ''
AND expert_account_status =1
AND ee_expert.expert_id IN
(
SELECT
expert_id
FROM
ee_expert_categories
WHERE
ee_expert_categories.category_id =5
GROUP BY
expert_id
)
GROUP BY
ee_expert.expert_id
ORDER BY
rating_count DESC
【问题讨论】:
欢迎来到 SO。发布问题时,让您的问题非常清楚真的很棒,因为它是,我猜您在问如何让您的查询运行得更快。其次,请,请,请 - 让您的查询易于阅读。 解释必须帮助运行解释语句并发布该语句 好的,下次我会记住这一点,谢谢建议 【参考方案1】:这应该会快一点:(删除了内联组,在这种情况下使用存在会有所帮助。)
SELECT
ee_expert.expert_id ,
AVG( ee_expert_rating.rating_stars ) AS total_rating,
COUNT( DISTINCT ee_expert_rating.rating_id ) AS rating_count
FROM
ee_expert_rating RIGHT JOIN
ee_expert ON ee_expert.expert_id = ee_expert_rating.expert_id
WHERE
expert_verified_email =2 AND
expert_brief_description != '' AND
expert_account_status =1 AND
exists(
SELECT
expert_id
FROM
ee_expert_categories
WHERE
ee_expert_categories.category_id =5 and
ee_expert_categories.expert_id=ee_expert.expert_id
)
GROUP BY
ee_expert.expert_id
ORDER BY
rating_count DESC
(尝试保留 IN 也/没有内部组。)
【讨论】:
感谢它稍微缩短了时间,但还有其他方法,即使用子查询可以提供帮助(我正在考虑使用交叉点是否可以缩短时间?) 如果ee_expert_categories 表只包含category_id 和expert_id,那么您可以将类别id 移到ee_expert 表中。任何可能的索引也可以在这个领域有所帮助。优化需要大量的 try-test-revert 迭代。【参考方案2】:有两件事让整个事情变慢了:
需要10秒,因为通过网络传输数据,并以html(phpMyAdmin?)显示,它比实际语句慢。这只是一个猜测,但在 98% 的情况下都是正确的。
在IN()
中使用子选择总是很慢(我认为是因为它是针对每个父数据集递归运行的)。一个选项是使用EXISTS()
【讨论】:
我首先使用存在,但这是它等同于 true 或 false 导致返回上层查询返回的所有结果,从而偏离预期的结果请你能给我其他建议吗跨度>以上是关于sql查询需要时间,因为我正在查看三个表的主要内容,如果未能解决你的问题,请参考以下文章