我刚启动我的网站,但在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)
该查询返回我想要的内容,但是当数据库具有数千行时,它的速度很慢。知道我该如何优化吗?
对于查询,您希望在以下位置建立索引:
likes(mapid)downloads(mapid)views(mapid)maps(id, userid)users(id)如果将这些列声明为主键,则可能已经有一些索引。
也就是说,查询可能仍然难以优化。 NOT IN与ORDER BY将是棘手的。
这些被创建为:
create index idx_likes_mapid on likes(mapid);
Run Code Online (Sandbox Code Playgroud)
等等。
| 归档时间: |
|
| 查看次数: |
58 次 |
| 最近记录: |