题解和SQL优化!

某乎问答单日回答问题数大于等于3个的所有用户

http://www.nowcoder.com/practice/821e5072663f485f8204cf03b89d322a

题意

给你一张回答记录表,请你查询出其中单日回答数大于等于3的所有用户信息

思路:

  • 因为需要限制的是回答数是分组后的的信息,所以我们需要在分组后使用HAVING,SQL如下

SELECT
    answer_date,
    author_id,
    COUNT(issue_id) AS 'answer_cnt'
FROM
    answer_tb
GROUP BY answer_date, author_id
HAVING answer_cnt >= 3
ORDER BY answer_date, author_id

     

优化

MySQL版本为5.7.10,数据基于牛客网的示例

分析:

  • 首先原表中没有任何索引,又因为我们需要分组和排序,所以用到了临时表和文件排序,因此Extra中有"Using temporary"和"Using filesort"

  • 此时查询计划使用的是全表扫描,查询开销为23.80 alt alt     思考:

  • 既然是因分组和排序而起,那么在这两个字段上创建索引不就行了?

  • 其实不然,因为分组和排序的字段是有先后顺序的,而如果两个字段的索引是独立的,那么在使用除第一个字段外的字段索引时是很低效的(会重复扫描),此时索引会失效

  • 因此,我们应该根据顺序创建一个联合索引,此时查看执行计划发现Extra字段变为了null,再查看查询开销发现降为了4.80! alt alt

MySQL练习 文章被收录于专栏

解析牛客网中的SQL题目

全部评论
大佬,这些sql优化知识怎样系统了解一下呢
点赞 回复 分享
发布于 2023-05-16 10:38 广西

相关推荐

Bug压路:老哥看得出来你是想多展示一些项目,但好像一般最多两个就够了😂页数一般一页,多的也就2页;这些项目应该是比较同质化的,和评论区其他大佬一样,我也觉得应该展示一些最拿手的(质量>数量)😁😁😁专业技能部分也可以稍微精简一些
点赞 评论 收藏
分享
10-07 20:48
门头沟学院 Java
听说改名就会有offer:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
3 1 评论
分享
牛客网
牛客企业服务