MySQL Filter优化,我该如何改进我的查询?

时间:2015-10-29 07:49:00

标签: mysql

我仍然是MySQL的初学者,但是我的移动应用程序很快就会在这里发布,我想确保在几百人注册我的数据库之后不会火上浇油。困扰我的是这里用户表的所有迭代。 (但是,我相信他们需要)这一个查询似乎迭代了用户表5次。

考虑一下我有50,000个用户。每次查询的迭代次数(250,000次),平均查询执行时间约为0.75 /在线用户/分钟

(注意:关于迭代如何工作的想法完全错了)

以下是查询:

SELECT * FROM ( 
    SELECT u.user_id, u.name, u.birthdate, u.biography, 
      (SELECT GROUP_CONCAT(photo_id) FROM photos p 
        WHERE p.user_id = u.user_id
      ) AS photo_ids 
    FROM users u 
    WHERE u.user_id NOT IN (SELECT q.user_id FROM users q WHERE q.gender = 1) 
    AND u.user_id NOT IN (SELECT q.user_id FROM users q WHERE q.gender = 0 AND q.sexuality = 2) 
    AND u.user_id NOT IN (id_in) 
    AND (u.birthdate BETWEEN (CURDATE() - INTERVAL 20 YEAR) AND (CURDATE() - INTERVAL 18 YEAR)) 
    AND (SELECT q.user_id FROM questions q WHERE (SELECT COUNT(*) FROM questions WHERE q.user_id = u.user_id) > 2 LIMIT 1)
) as DT WHERE DT.photo_ids IS NOT NULL LIMIT 9;

此查询的目标(完成其工作)是从数据库中获取最多9个用户:

  • 他们有个人资料图片(Group concat check this)
  • 他们年龄在18到20岁之间
  • 他们是女性,不论是异性恋还是双性恋
  • 他们在数据库中至少有至少3个问题。

我一直非常小心只按我需要的方式返回数据(因此GROUP_CONCAT用于将用户的照片ID保持在同一行)。最后只返回5行。 users表大约有14个。

我只是想知道如何改进这个查询,因为我还在学习,我认为这是最好的问题。考虑到多年来可能一直在搞乱MySQL的人数。

经过一些批评后,这是我的新询问:

SELECT u.user_id, u.name, u.birthdate, u.biography 
FROM users u
WHERE u.user_id != id_in
AND u.gender != 0
AND u.sexuality != 2
AND u.birthdate BETWEEN (CURDATE() - INTERVAL 22 YEAR) AND (CURDATE() - INTERVAL 18 YEAR)
AND ((SELECT COUNT(user_id) FROM questions WHERE user_id = u.user_id) > 2)
LIMIT 9

0 个答案:

没有答案