【发布时间】:2020-05-31 19:25:22
【问题描述】:
我安装了一个插件,并在后端进行了优化(SSD,在 GROUP BY & WHERE 中调用的列的单列索引) 但是在运行这个查询时
SELECT u.user_id, u.profile_page_id, u.server_id AS user_server_id, u.user_name, u.full_name, u.gender, u.user_image, u.is_invisible, u.user_group_id, u.language_id, u.birthday, u.country_iso, m.*
FROM(
(SELECT m.*
FROM phpfox_channel_video AS m
INNER JOIN phpfox_channel_category AS mc
ON(mc.category_id = mc.category_id)
INNER JOIN phpfox_channel_category_data AS mcd
ON(mcd.video_id = m.video_id)
WHERE m.in_process = 0 AND m.view_id = 0 AND m.module_id = 'videochannel' AND m.item_id = 0 AND m.privacy IN(0) AND mcd.category_id = 17
GROUP BY m.video_id
ORDER BY m.time_stamp DESC
)) AS m
JOIN phpfox_user AS u
ON(u.user_id = m.user_id)
ORDER BY m.time_stamp DESC
LIMIT 24;
这需要 20 秒,而改成这个
SELECT u.user_id, u.profile_page_id, u.server_id AS user_server_id, u.user_name, u.full_name, u.gender, u.user_image, u.is_invisible, u.user_group_id, u.language_id, u.birthday, u.country_iso, m.*
FROM(
(SELECT m.*
FROM phpfox_channel_video AS m
INNER JOIN phpfox_channel_category_data AS mcd
ON(mcd.video_id = m.video_id AND mcd.category_id = 17)
WHERE m.in_process = 0 AND m.view_id = 0 AND m.module_id = 'videochannel' AND m.item_id = 0 AND m.privacy IN(0)
GROUP BY m.video_id
ORDER BY m.time_stamp DESC
)) AS m
JOIN phpfox_user AS u
ON(u.user_id = m.user_id)
ORDER BY m.time_stamp DESC
LIMIT 24;
这运行大约 5-6 秒
phpfox_channel_video 包含 200 万行(并将继续快速添加,它是一个社交媒体网站,用户也可以上传文件)所以缓存不是很有用(但已激活)。
关于如何优化它的任何提示?我对 MariaDB/MySQL 的经验很少,因为我已经习惯了 MS SQL 来处理大数据,并创建了自己的结构。任何推荐的方法都不需要对表格进行太多改动(添加表格就可以了)。
或者我是否需要重组 PHP & 表以优化查询以低于 1 秒/查询。 谢谢!
我找到了这些链接 http://mysql.rjweb.org/doc.php/memory & http://mysql.rjweb.org/doc.php/ricksrots#indexing
它们仍然相关吗?
附上解释结果 而对于索引,当前的配置设置为索引,每一列都被声明为一个索引键,上面查询中涉及的所有表。
打印出我当前的服务器配置会有帮助吗?谢谢!
【问题讨论】:
-
添加解释您的查询以及您拥有的索引或为所有涉及的表创建表-
-
嗨@nbk 我已经更新了帖子。有什么反馈吗?
-
您提供的前两个链接来自@RickJames
-
@tcadidot9 谢谢,我会发消息给他
-
是的,这两个链接仍然有效。我确实“根据需要”更新它们。 (相关性是另一个问题。)