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

我刚启动我的网站,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();

这个查询返回我想要的,但是当数据库有数千行时它很慢。知道如何优化它吗?


小唯快跑啊
浏览 111回答 1
1回答

慕尼黑8549860

对于您的查询,您需要索引:likes(mapid)downloads(mapid)views(mapid)maps(id, userid)users(id)如果将列声明为主键,您可能已经拥有其中一些索引。也就是说,查询可能仍然难以优化。 NOT INwithORDER BY会很棘手。这些创建为:create index idx_likes_mapid on likes(mapid);
打开App,查看更多内容
随时随地看视频慕课网APP