题意

给你一张题目信息表,一个回答情况表,请你查询出其中回答过教育类问题的用户中,回答过职场问题的用户数量

思路:

  • 因为在统计前,我们需要对用户回答过的问题类型进行限制,而这个限制本身又有个条件(即在回答过教育类的用户中去查询)
  • 因此我们首先应该为这个限制,获取对应的记录,因此我们需要先查询出所有回答过教育类问题的用户,SQL如下

SQL1:

SELECT
	t2.author_id
FROM
	issue_tb AS t1
INNER JOIN answer_tb AS t2 ON t1.issue_id = t2.issue_id
WHERE t1.issue_type = 'Education'
  • 将该查询结果作为条件之一,再统计用户数量即可,SQL如下
SELECT
    COUNT(DISTINCT t2.author_id) AS 'num'
FROM
    issue_tb AS t1
INNER JOIN answer_tb AS t2 ON t1.issue_id = t2.issue_id
WHERE t2.author_id IN (
    SQL1
    )
AND t1.issue_type = 'Career';

   

优化

  • 按照惯例查看执行计划,因为没有索引,所以全为全表扫描
  • 此时开销为21.38 alt alt

   

分析:

  • 对于没有任何索引的表(其实还是有隐藏列的),我们可以利用《阿里巴巴Java开发手册》中对索引的约束,对两表连接的字段添加索引
  • 所以我们对两表的issue_id添加索引,再为answer_tb中的author_id字段添加索引
  • 为什么不为issue_type建立索引呢?首先,这个字段在表中的区分度并不高,就算加上,也作用不大,甚至会起反作用(各位可以去试试)
  • 优化后,我们再次查看开销,降为了13.50 alt alt