在表中查找公共行的最佳方法是什么

时间:2011-03-07 22:18:28

标签: mysql performance scalability

我们有一个网络项目,有一些多项选择题,注册用户回答它们。
我想找到两个用户的常见答案进行比较。我的意思是,登录的用户将转到其他用户的个人资料页面,只看到他们的答案的比较,仅针对他们的常见问题......

表格就像(简化):

问题
ID
问题
有效 - >枚举('Y','N')

答案
ID
question_id
答案

用户
ID
尼克

user_answers
USER_ID
question_id
answer_id
私人 - >枚举('Y','N')

我可以通过给出别名来加入user_answers表,但我也必须加入其他表。不应考虑私人答案,只应采取积极的问题......

该网站预计会有一些负载,所以我担心有太多的连接和条件。根据我的经验,我知道这些复杂的查询可能会锁定表并导致一些严重的性能问题,尤其是在负载很重的情况下......

因此,考虑到可扩展性和性能时,最佳做法是什么? 会smt。像狮身人面像或太阳能帮助,或任何基于软件的解决方案进行比较?

结果将按照方式分页......

现在我正在考虑分离问题详细信息并回答详细信息并缓存它们,因此查询将是smt。像:

select ua1.answer_id as her_answer_id,
       ua2.answer_id as my_answer_id,
       ua1.question_id
  from user_answers ua1
 inner join users_answers ua2 on ua1.question_id=ua2.question_id
 where ua1.user_id=$herId
   and ua2.user_id=$myId
   and ua1.private='N'
 order by ua1.question_id desc
问题。问题和答案。将从缓存中获取...在这种情况下,被动问题将是一个问题,但我想我会尝试移动被动问题,因为某些备份数据库会使事情复杂化......

1 个答案:

答案 0 :(得分:0)

我会在查询中使用条件:

select
user_answers.question_id `QuestionId`,
max(if((user_answers.user_id = my_id), user_answers.answer_id, 0)) `MyAnswer`,
max(if((user_answers.user_id = other_id), user_answers.answer_id, 0)) `OtherAnswer`
from users_answers
where user_answers.private = 'N'
and user_answers.user_id IN(myid, orderid)
group by users_answers.question_id
having count(*) = 2
order by user_answers.question_id

没有测试过,但你应该明白这个想法!

希望这对你有用......