我有一个约400k行的用户表,需要检索其中一些(最多100),同时与其他表进行多个JOINS。 (使用mysql)如何优化这个慢sql查询?
我的问题是,查询目前有约800ms的执行时间(取46ms)。我的目标是优化查询以减少执行时间。
我的初始查询看起来是这样的:
SELECT iduser, imageurl, birthdate, active, last_active, created, gender_idgender, orientation_idorientation, region_idregion, moji.moji_idmoji as moji_idmoji, status.value as status, requests.value as requestsRecv, requestssent.value as requestsSent, username.value as username, likecount.value as likeCount, reportcount.value as reportCount
FROM user u
JOIN user_has_moji moji ON (u.iduser = moji.user_iduser)
JOIN user_has_data status ON (u.iduser = status.user_iduser AND status.datatype_iddatatype = 1)
JOIN user_has_data requests ON (u.iduser = requests.user_iduser AND requests.datatype_iddatatype = 3)
JOIN user_has_data requestssent ON (u.iduser = requestssent.user_iduser AND requestssent.datatype_iddatatype = 4)
JOIN user_has_data username ON (u.iduser = username.user_iduser AND username.datatype_iddatatype = 5)
JOIN user_has_data likecount ON (u.iduser = likecount.user_iduser AND likecount.datatype_iddatatype = 6)
JOIN user_has_data reportcount ON (u.iduser = reportcount.user_iduser AND reportcount.datatype_iddatatype = 7)
WHERE banned = 0 AND active = 1 AND u.reviewstatus_idreviewstatus = 3 AND DATEDIFF(last_active,'2017-03-03 10:06:36') >=0 AND DATEDIFF(birthdate, '1999-03-03 15:06:36') >= 0 AND DATEDIFF(birthdate, '1967-03-03 15:06:36') <= 0 ORDER BY last_active DESC LIMIT 100
我认为原因执行时间较长的是,它有这样做的查询,因此我尝试这种方法之前加入与其他表的整个用户表:
SELECT iduser, imageurl, birthdate, active, last_active, created, gender_idgender, orientation_idorientation, region_idregion, moji.moji_idmoji as moji_idmoji, status.value as status, requests.value as requestsRecv, requestssent.value as requestsSent, username.value as username, likecount.value as likeCount, reportcount.value as reportCount
FROM (SELECT * FROM user WHERE banned = 0 AND active = 1 AND reviewstatus_idreviewstatus = 3 AND DATEDIFF(last_active,'2017-03-03 10:01:30') >=0 AND DATEDIFF(birthdate, '1999-03-03 15:01:30') >= 0 AND DATEDIFF(birthdate, '1967-03-03 15:01:30') <= 0 ORDER BY last_active DESC LIMIT 100) as u
JOIN user_has_moji moji ON (u.iduser = moji.user_iduser)
JOIN user_has_data status ON (u.iduser = status.user_iduser AND status.datatype_iddatatype = 1)
JOIN user_has_data requests ON (u.iduser = requests.user_iduser AND requests.datatype_iddatatype = 3)
JOIN user_has_data requestssent ON (u.iduser = requestssent.user_iduser AND requestssent.datatype_iddatatype = 4)
JOIN user_has_data username ON (u.iduser = username.user_iduser AND username.datatype_iddatatype = 5)
JOIN user_has_data likecount ON (u.iduser = likecount.user_iduser AND likecount.datatype_iddatatype = 6)
JOIN user_has_data reportcount ON (u.iduser = reportcount.user_iduser AND reportcount.datatype_iddatatype = 7)
想想需要连接的行数会大大减少,因此会缩短执行时间。这种改变似乎有所帮助,但查询仍然太低。
有人可以看到执行缓慢的一些其他原因吗?
似乎是一个合理的响应时间... – jarlh
查询似乎固定,建议索引改进... – JohnHC