题解和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 广西

相关推荐

牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
头像
10-09 19:35
门头沟学院 Java
洛必不可达:java的竞争激烈程度是其他任何岗位的10到20倍
点赞 评论 收藏
分享
3 1 评论
分享
牛客网
牛客企业服务