【发布时间】:2015-01-26 14:48:29
【问题描述】:
我们有一个已有 10 年历史的网站一直在使用 SMF。现在我们编写了自己的论坛脚本,但由于我们是没有经验的开发人员,我们对优化一无所知。我们的消息表太大(大约 2 GB,包括索引,总共 2.654.193 行)。 SMF 使用此表的速度非常快,但我们的新论坛脚本导致系统平均负载较高。
这里是查询列表:http://i.imgur.com/NPm0DmM.jpg
这里是表结构和索引:http://i.imgur.com/FwPdMoI.jpg
注意:我们使用 APC 进行加速,使用 Memcached 进行缓存。我百分百确定消息表(可能还有主题表)正在减慢我们的网站速度。
【问题讨论】:
-
使用更少的 IN() 的更多连接。可排序列上有更多索引
-
尝试使用 xdebug profiler 查看 PHP 方面的速度变慢了。还可以在 MySQL 慢查询日志中调试慢查询,以查看 MySQL 方面的速度变慢,分析它们并考虑使用正确的索引。也尽量避免 count(*) - 而是使用 count(id)
-
@sanis
SELECT * FROM topics as t1 LEFT JOIN (SELECT id, topic_id as tid, poster, body, post_date, poster_ip, subject FROM messages as t9 ORDER BY post_date DESC) as t2 ON t1.topic_id = t2.tid WHERE (super_pinned = 0 AND pinned = 0) AND (room_id = 45 OR (mirror_id = 45 AND room_id IN (45))) GROUP BY t1.topic_id这个查询需要很长时间。我该如何优化它? -
如果可能的话,删除子选择并将其移动到单独的查询中。子选择非常慢。我并没有深入了解数据库结构,无法准确说明如何处理此查询。我只能说,尽量避免子选择。
标签: php mysql optimization indexing