MySQL过滤器优化,如何改进我的查询?

MySQL过滤器优化,如何改进我的查询?,mysql,Mysql,说到MySQL,我还是一个初学者,但随着我的移动应用程序很快在这里上线,我想确保在几百人注册之后,我的数据库不会着火。困扰我的是这里用户表的所有迭代。(然而,我相信它们是必需的)这一查询似乎在users表上迭代了5次 假设我有50000个用户。即每个查询(250000)次迭代,平均查询执行时间约为0.75/在线用户/分钟 (注意:我关于迭代如何工作的想法可能是完全错误的) 问题是: SELECT * FROM ( SELECT u.user_id, u.name, u.birthdat

说到MySQL,我还是一个初学者,但随着我的移动应用程序很快在这里上线,我想确保在几百人注册之后,我的数据库不会着火。困扰我的是这里用户表的所有迭代。(然而,我相信它们是必需的)这一查询似乎在users表上迭代了5次

假设我有50000个用户。即每个查询(250000)次迭代,平均查询执行时间约为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个用户,其中:

  • 他们有个人资料图片(concat组检查此)
  • 他们年龄在18到20岁之间
  • 她们是女性,不是异性恋就是双性恋
  • 他们在数据库中至少有3个问题
我非常小心地只返回我需要的数据(因此使用GROUP_CONCAT将用户的照片ID保持在同一行)。最后只返回5行。用户表中有大约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

@jkavalik-这里的问题是一个连接将为用户返回多行。(假设他们有三张照片,那就是三排)。
组_CONCAT
用于将照片ID存储在逗号分隔的字符串中,以发送给客户端。然后,客户机通过AJAX请求下载基于id的照片。无论如何,我都想要它们,所以主要的目标不是检查它是否“存在”,返回多行是否更有效?我更新了问题中的查询,让我知道这是否更好。(它没有group_concat),但用户可以拥有0到5张照片。没有了。我只是想以(id,id,id,id,id)格式将它们发送给客户机。
DT.photo_id不为NULL的原因是,如果用户没有id,则字段将返回
NULL
。这很好,但请记住我使用的是
限制9
。我不想返回没有任何图片的用户。这就是我使用临时表/where语句的原因。有更好的方法吗?你建议只运行两个查询吗?@jkavalik-我不使用order by的原因是,结果其实并不重要,只是它们被过滤了。我知道我可以通过这种方式检查照片的存在性,但是如果返回行中照片的ID呢?(类似于
group\u concat
如何将所有ID放入
photo\u ID
行)?users表目前没有索引,因为我不确定它是否真的那么有用。性别的选项是
0/1
,性的选项是
0/1/2
。(0,1)
中的
会比
好吗!=2
?您能否举例说明join/groupby/group_concat的外观?如上所述,我仍然是一个初学者与所有这些。我真的很不擅长让加入者做我想做的事。让我们一起做吧。