这是我在源代码中的查询
SELECT `truyen`.*, MAX(chapter.chapter) AS last_chapter
FROM (`truyen`)
LEFT JOIN `chapter` ON `chapter`.`truyen` = `truyen`.`Id`
WHERE `truyen`.`title` LIKE \'%%\'
GROUP BY `truyen`.`Id`
LIMIT 250当我将它安装在iFastnet主机上时,由于连接而导致超过500,000行被检查,并且查询被阻塞(这将占用超过100%的CPU,这最终会导致服务器不稳定)。
我也试着在查询之前添加这一行,它修复了上面的问题,但导致了另一个问题,使一些函数无法正确运行
mysql_query("SET SQL_BIG_SELECTS=1");如何在不购买其他主机的情况下解决此问题?
谢谢。
发布于 2014-08-23 02:34:41
您可能正在寻找一个内部联接。这将删除不匹配的结果。我发现内部连接比左连接更快。
然而,我不确定你真正想要的结果是什么。但是因为您使用的是GROUP BY,所以看起来内部连接可能对您有效。
我推荐的一件事是将它生成的查询复制并粘贴到前面带有DESCRIBE的SQL中。
因此,如果查询结果为:
SELECT truyen.*, MAX(chapter.chapter) AS last_chapter FROM truyen
LEFT JOIN chapter ON chapter.truyen = truyen.Id
WHERE truyen.title LIKE '%queryString%'您可以键入:
DESCRIBE SELECT truyen.*, MAX(chapter.chapter) AS last_chapter FROM truyen
LEFT JOIN chapter ON chapter.truyen = truyen.Id
WHERE truyen.title LIKE '%queryString%'这将告诉您是否可以将索引广告到表中,以便更快地连接。
我希望这至少给你指明了正确的方向。
Michael Berkowski似乎同意索引,您将能够从描述中看到。
发布于 2014-08-23 02:49:01
如果你在chapter.chapter和chapter.truyen上有索引,请查看。如果没有,请设置它们,然后重试。如果不成功,请尝试以下建议:
您是否有可能在插入/更新章节表的列中的最后一章时永久标记?然后,您可以使用它来减少联接的行数,并且可以删除GROUP BY。也许是这样的:
SELECT `truyen`.*, `chapter`.`chapter` as `last_chapter`
FROM `truyen`, `chapter`
WHERE `chapter`.`truyen` = `truyen`.`Id`
AND `chapter`.`flag_last_chapter` = 1
AND `truyen`.`title` LIKE '%queryString%'
LIMIT 250或者为此创建一个新表:
INSERT INTO new_table (truyen, last_chapter)
SELECT truyen, MAX(chapter) FROM chapter GROUP BY truyen;
SELECT `truyen`.*, `new_table`.`last_chapter`
FROM (`truyen`)
LEFT JOIN `new_table` ON `new_table`.`truyen` = `truyen`.`Id`
WHERE `truyen`.`title` LIKE '%queryString%'
GROUP BY `truyen`.`Id`
LIMIT 250否则,您可以只获取这250行truyen,将truyen in收集到一个数组中,然后构建另一个SQL语句来选择章表的250行。我已经在你的原始问题中看到,你可以使用PHP来做这件事。因此,您可以在此之后合并结果:
SELECT * FROM truyen
WHERE title LIKE '%queryString%'
LIMIT 250
SELECT truyen, MAX(chapter) AS last_chapter
FROM chapter
WHERE truyen in (comma_separated_ids_from_first_select)https://stackoverflow.com/questions/25453184
复制相似问题