我仍然是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用于将用户的照片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