为了账号安全,请及时绑定邮箱和手机立即绑定

当涉及数千行时,如何优化此 mysql 查询以使其更快?

当涉及数千行时,如何优化此 mysql 查询以使其更快?

PHP
小唯快跑啊 2021-12-24 15:46:43
我刚启动我的网站,5 天后它变慢了,加载网站花了将近 30 秒,因为 mysql 数据库变得更大,加上 50-60k 行。我已经搜索了几个小时的解决方案,但我没有找到任何可以实现来优化我的查询的东西。$idstack = $_SESSION['ids'];      $stmt = $mysqli->prepare("SELECT       maps.id,      maps.name,      maps.date,      maps.mcversion,      maps.mapid,      maps.description,      maps.java,      maps.bedrock,      maps.schematic,      users.username,      users.rank,      users.verified,      (SELECT COUNT(*) FROM likes WHERE likes.mapid = maps.id) AS likes,      (SELECT COUNT(*) FROM downloads WHERE downloads.mapid = maps.id) AS downloads,      (SELECT COUNT(*) FROM views WHERE views.mapid = maps.id) AS views      FROM maps      INNER JOIN users       ON maps.userid = users.id      WHERE maps.id NOT IN ( '" . implode( "', '" , (array)$idstack ) . "' ) ORDER BY RAND() DESC LIMIT 15");      $stmt->execute();      $result = $stmt->get_result();这个查询返回我想要的,但是当数据库有数千行时它很慢。知道如何优化它吗?
查看完整描述

1 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

对于您的查询,您需要索引:

  • likes(mapid)

  • downloads(mapid)

  • views(mapid)

  • maps(id, userid)

  • users(id)

如果将列声明为主键,您可能已经拥有其中一些索引。

也就是说,查询可能仍然难以优化。 NOT INwithORDER BY会很棘手。

这些创建为:

create index idx_likes_mapid on likes(mapid);


查看完整回答
反对 回复 2021-12-24
  • 1 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信