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