Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何优化这个缓慢的sql查询?_Mysql_Sql - Fatal编程技术网

Mysql 如何优化这个缓慢的sql查询?

Mysql 如何优化这个缓慢的sql查询?,mysql,sql,Mysql,Sql,我有一个用户表,大约有400k行,在与其他表进行多个联接时,需要检索其中的一些(最多100行)。(使用mysql) 我的问题是,查询当前的执行时间约为800毫秒(取46毫秒)。我的目标是优化查询以减少执行时间 我的初始查询如下所示: SELECT iduser, imageurl, birthdate, active, last_active, created, gender_idgender, orientation_idorientation, region_idregion, moji.m

我有一个用户表,大约有400k行,在与其他表进行多个联接时,需要检索其中的一些(最多100行)。(使用mysql)

我的问题是,查询当前的执行时间约为800毫秒(取46毫秒)。我的目标是优化查询以减少执行时间

我的初始查询如下所示:

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
选择iduser、imageurl、生日、活动、上次活动、已创建、性别、方向、地区、moji.moji\u idmoji作为moji\u idmoji、status.value作为status、requests.value作为requestsRecv、requestssent.value作为requestssent、username.value作为username、likecount.value作为likecount、reportcount.value作为reportcount
来自用户u
加入用户\u已打开\u moji moji(u.iduser=moji.user\u iduser)
加入用户\u的数据状态为(u.iduser=status.user\u iduser和status.datatype\u iddatatype=1)
加入用户在上有数据请求(u.iduser=requests.user\u iduser和requests.datatype\u iddatatype=3)
JOIN user_已启用_data requestssent(u.iduser=requestssent.user_iduser和requestssent.datatype_iddatatype=4)
加入用户\u上有\u数据用户名(u.iduser=username.user\u iduser和username.datatype\u iddatatype=5)
加入用户\u具有\u数据,如登录(u.iduser=likecount.user\u iduser和likecount.datatype\u iddatatype=6)
JOIN user_已启用_数据报告计数(u.iduser=reportcount.user_iduser和reportcount.datatype_iddatatype=7)

其中禁止=0且有效=1,u.reviewstatus_idreviewstatus=3且DATEDIFF(最后有效,'2017-03-03 10:06:36')>=0且DATEDIFF(生日,'1999-03-03 15:06:36')>=0且DATEDIFF(生日,'1967-03-03 15:06:36')=0且DATEDIFF(生日,'1999-03-03 15:01:30')>=0且DATEDIFF(生日,'1967-03-03-03 15:01:30'))您有一个非常合理的响应时间,因此您的表似乎已被正确索引。但是,让我们看看
WHERE
子句(我添加了假定的表别名):

我对最后三种情况有点怀疑,但使用
datediff()
会让人困惑。这就是为什么简单的比较更好的一个原因

您需要快速查找这些行,这意味着两个索引之一:

users(banned, active, reviewstatus_idreviewstatus, last_active, birthdate)

这取决于哪一个更能缩减数据。我的猜测是,
最后一个激活的
更重要。还要注意,前三个键可以是任意顺序,只要它们是前三个键


这可能会有所帮助,但我怀疑您是否会看到显著的改进。

您有一个非常合理的响应时间,因此您的表似乎会被正确地索引。但是,让我们看看
WHERE
子句(我添加了假定的表别名):

我对最后三种情况有点怀疑,但使用
datediff()
会让人困惑。这就是为什么简单的比较更好的一个原因

您需要快速查找这些行,这意味着两个索引之一:

users(banned, active, reviewstatus_idreviewstatus, last_active, birthdate)

这取决于哪一个更能缩减数据。我的猜测是,
最后一个激活的
更重要。还要注意,前三个键可以是任意顺序,只要它们是前三个键


这可能会有所帮助,但我怀疑您是否会看到惊人的改进。

似乎是合理的响应时间…查询似乎可靠,建议索引改进…似乎是合理的响应时间…查询似乎可靠,建议索引改进…感谢acutally确实有点帮助:)100-200毫秒更快Hanks acutally确实有点帮助:)100-200毫秒更快
WHERE u.banned = 0 AND u.active = 1 AND
      u.reviewstatus_idreviewstatus = 3 AND
      u.last_active >= '2017-03-03 10:06:36' AND
      u.birthdate >= '1999-03-03 15:06:36' AND
      u.birthdate <= '1967-03-03 15:06:36'
users(banned, active, reviewstatus_idreviewstatus, last_active, birthdate)
users(banned, active, reviewstatus_idreviewstatus, birthdate, last_active)