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

Dom*_*ogh -2 php mysql sql

我刚启动我的网站,但在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();
Run Code Online (Sandbox Code Playgroud)

该查询返回我想要的内容,但是当数据库具有数千行时,它的速度很慢。知道我该如何优化吗?

Gor*_*off 5

对于查询,您希望在以下位置建立索引:

  • likes(mapid)
  • downloads(mapid)
  • views(mapid)
  • maps(id, userid)
  • users(id)

如果将这些列声明为主键,则可能已经有一些索引。

也就是说,查询可能仍然难以优化。 NOT INORDER BY将是棘手的。

这些被创建为:

create index idx_likes_mapid on likes(mapid);
Run Code Online (Sandbox Code Playgroud)

等等。