統(tǒng)計(jì)29萬條數(shù)據(jù)耗時(shí)13秒,是否合理?
問題:
執(zhí)行如下sql查詢時(shí),耗時(shí)13秒,查詢29萬條數(shù)據(jù)。
select count(*) from `t_order_old`
登錄后復(fù)制
解答:
直接使用count(*)統(tǒng)計(jì)數(shù)據(jù)可能會導(dǎo)致性能問題。尤其是在數(shù)據(jù)量較大時(shí),每次查詢都需要遍歷所有數(shù)據(jù)進(jìn)行統(tǒng)計(jì)。
優(yōu)化建議:
避免使用count(*),轉(zhuǎn)而將需要的統(tǒng)計(jì)結(jié)果單獨(dú)存儲。
- 使用觸發(fā)器:
在更新數(shù)據(jù)時(shí)自動更新統(tǒng)計(jì)數(shù)據(jù)。 - 自行維護(hù)統(tǒng)計(jì)數(shù)據(jù):
在業(yè)務(wù)邏輯中同步維護(hù)統(tǒng)計(jì)數(shù)據(jù)。
示例:
以文章回復(fù)數(shù)量為例,可以使用如下方式統(tǒng)計(jì):
-- 主表 CREATE TABLE `t_article` ( `article_id` INT NOT NULL AUTO_INCREMENT, `reply_count` INT NOT NULL DEFAULT 0, PRIMARY KEY (`article_id`) ); -- 觸發(fā)器:更新回復(fù)數(shù)量 CREATE TRIGGER `tr_article_update_reply_count` AFTER UPDATE ON `t_reply` FOR EACH ROW BEGIN UPDATE `t_article` SET `reply_count` = `reply_count` + NEW.`status` - OLD.`status` WHERE `article_id` = NEW.`article_id`; END;
登錄后復(fù)制
這樣,每次更新回復(fù)數(shù)據(jù)時(shí),文章的回復(fù)數(shù)量會自動更新,從而避免使用count(*)頻繁統(tǒng)計(jì)。