最近一直思考這個(gè)問(wèn)題,項(xiàng)目數(shù)據(jù)都是百萬(wàn)級(jí)別的,百度了很多方案,貌似沒(méi)有最好的方案
1:循環(huán)查庫(kù)肯定不行了
2:鏈表查詢(行嗎)?
3:laravel ORM 模型(行嗎)?貌似也是取所有評(píng)論數(shù)據(jù),然后take切斷
不知道子查詢行不行,外層查詢100篇文章,子查詢最新3條評(píng)論,然后CONCAT_WS或者GROUP_WS連接評(píng)論
百萬(wàn)級(jí)能有多大,就算用1最壞情況也就是1+100個(gè)查詢,DB索引和緩存得當(dāng)這都不是問(wèn)題
基礎(chǔ)消耗是擺在那里(假定單條查詢?nèi)甲吡怂饕?,就算你怎么個(gè)去考慮如何寫,最終的基礎(chǔ)消耗都差不多,與其在這個(gè)地方扣細(xì)節(jié)(我看你已經(jīng)糾結(jié)了好多天了),不如在其他的地方考慮如何去降低使用基礎(chǔ)消耗的頻次(比如緩存)
換我就想都不用想直接第一種+緩存簡(jiǎn)單直接,別看它土但是有效啊,花時(shí)間琢磨些奇技淫巧最后發(fā)現(xiàn)浪費(fèi)了時(shí)間卻沒(méi)卵用..
你這個(gè)是文章,不是高頻交易,實(shí)時(shí)性沒(méi)有那么重要
laravel ORM 偽代碼
$atricles = db::table('article')->where(xxx)->orderby(xxx)->->limit(100)->get()->each(function($item){
$tiem->comments = db::table('comments')->where(xxx)->orderby(xxx)->->limit(3)->get();
});
不要覺(jué)得我這個(gè)土,主表38個(gè)字段,2500萬(wàn)數(shù)據(jù),關(guān)聯(lián)表41個(gè)字段,6600萬(wàn)數(shù)據(jù),都走索引的情況下,用上面的方式執(zhí)行時(shí)間100ms左右
1.App一次性無(wú)法顯示100條,可以做成滾動(dòng)加載模式
2.異步加載每條的評(píng)論
關(guān)鍵看數(shù)據(jù)庫(kù)表設(shè)計(jì),以及app產(chǎn)品的設(shè)計(jì)。
使用Laravel ORM如下
$articles = Article::limit(100)->get();
$query = $articles->map(
fn($query) => $query->comments()->limit(3)
)->reduce(
fn($carry, $query) => $carry ? $carry->unionAll($query) : $query
);
$comments = $query->get();
不考慮反查最新評(píng)論,獲取300條最新評(píng)論的還有關(guān)聯(lián)的文章記錄,在用PHP整合一下就完事了么?[狗頭]
首先,需要在文章表和評(píng)論表之間建立一對(duì)多的關(guān)聯(lián)關(guān)系,即在評(píng)論表中引入一列文章 id(article_id),表示評(píng)論所屬的文章。
假設(shè)文章表名為 article,具有 article_id、title、content 等列;評(píng)論表名為 comment,具有 comment_id、article_id、content 等列。
然后,使用以下 SQL 語(yǔ)句來(lái)查詢文章和對(duì)應(yīng)的最新3條評(píng)論:
SELECT a.title, a.content, c.content
FROM
(SELECT article_id, title, content FROM article LIMIT 100) a
LEFT JOIN
(
SELECT article_id, content
FROM comment c1
WHERE (
SELECT COUNT(*)
FROM comment c2
WHERE c2.article_id = c1.article_id AND c2.comment_id >= c1.comment_id
) <= 3
) c ON a.article_id = c.article_id
ORDER BY a.article_id DESC, c.comment_id ASC
首先,使用子查詢獲取最新發(fā)布的100篇文章,限制顯示數(shù)量不超過(guò)100篇,以提高查詢效率。
然后,使用左連接將文章和評(píng)論合并起來(lái),并使用子查詢獲取每篇文章的最新3條評(píng)論。
最后,按照文章 id 降序排列,評(píng)論 id 升序排列,確保結(jié)果集中的評(píng)論是最新的前三條。
需要注意的是,以上 SQL 語(yǔ)句僅供參考,具體實(shí)現(xiàn)還需要針對(duì)實(shí)際情況進(jìn)行調(diào)整和優(yōu)化。同時(shí),還需要注意索引和緩存的使用以提高查詢效率。
查詢出文章然后循環(huán)拼接查詢?cè)u(píng)論的sql union all
如:
( SELECT id,article_id, content FROM comment where id =1 limit 3)
union all
( SELECT id,article_id, content FROM comment where id =2 limit 3)