鍍金池/ 問答/人工智能  Java  PHP  C  數(shù)據(jù)庫/ mysql查詢導(dǎo)致內(nèi)存過大問題

mysql查詢導(dǎo)致內(nèi)存過大問題

在查詢數(shù)據(jù)庫的時候,由于數(shù)據(jù)量大,我要做分頁,然后首先獲取總的條數(shù),但是使用sql語句SELECT COUNT(*) as total from WHERE addtime between 1164038401 and 1511235339;這條sql等于遍歷了全表,數(shù)據(jù)有一百萬條,id為主鍵索引,addtime為普通索引?,F(xiàn)在問題是一使用這條語句內(nèi)存使用量就從一開始的30%多直接上升到90%多,怎么解決這個內(nèi)存問題?
我現(xiàn)在只是查詢個數(shù),但是分頁的時候會查詢有條件的大量數(shù)據(jù),對于內(nèi)存過大,有什么好的解決辦法?比如sql不使用緩存,修改配置文件等等。
求大神指導(dǎo),謝謝!

回答
編輯回答
她愚我

100w行數(shù)據(jù),你內(nèi)存又不夠,分表吧,分成十個。
然后判斷哪幾個表在時間區(qū)間內(nèi)有數(shù)據(jù)(查詢第一個和最后一個數(shù)據(jù)即可判斷)
最后只在這幾個表中查詢,匯總,這樣大概能減少80%的內(nèi)存占用和時間。
如果還嫌速度慢,那就大數(shù)據(jù),多臺服務(wù)器并發(fā)查詢各自的子表,最后加和。

2017年10月28日 17:27
編輯回答
過客

1、數(shù)量,@rift說的對,你做分頁頁數(shù)太多別人也不會翻這么多頁

2、分頁查詢數(shù)據(jù)可以分為兩步吧
1) select id from XXX where xxx=xx;
2) select * from XXX where id in (ids)
這樣查詢會好些

2017年1月13日 03:05
編輯回答
未命名

MyISAM引擎中count(*)非??? 可以用下面這樣:
select (select count() from 表) - count()
from 表 where addtime between 1164038401 and 1511235339;
該查詢會將子查詢當(dāng)做常數(shù)處理.

2018年1月13日 04:42
編輯回答
乞許

你explain這條查詢語句,由于count(*),type字段肯定是All,所以肯定是走全表的,但是如果你是count(id),應(yīng)該會是ref,因為addtime你加索引了。

2017年10月19日 19:31
編輯回答
笨笨噠

如果 id 是連續(xù)的,可以使用 id 作為分頁依據(jù)

SELECT field FROM table_name WHERE `id` < num1 and `id` > num2

或者, id + limit 配合使用

SELECT field FROM table_name WHERE `id` > num LIMIT page_size

這樣做的目的:

  • 大數(shù)據(jù)量時,LIMIT OFFSET 效率太低

  • id 唯一,自增,效率高于普通索引

2018年9月19日 04:07
編輯回答
生性

對于幾百萬行+的大表來說,COUNT(*)是非常耗時的,你看能不能換個方式處理下。

要么在業(yè)務(wù)上索性就不統(tǒng)計,你想想你做分頁,每頁10條數(shù)據(jù),兩百萬行就是 20 萬頁,你統(tǒng)計了別人會翻這么多頁嗎。

另一種方式就是如果你的主鍵是連續(xù)遞增的,就可以通過邊界值相減得到統(tǒng)計結(jié)果,這比你直接 count 肯定是減少了不少時間。

2017年5月8日 00:03
編輯回答
她愚我

建議使用MySQL分區(qū)表,用addtime作為分區(qū)字段,不要任何索引。查詢的時候帶分區(qū)字段,確保查詢掃描的分區(qū)表個數(shù)在一個很少的數(shù)量。這個方案不需要改動數(shù)據(jù)表結(jié)構(gòu)和改動代碼,實施成本低,效果很不錯。

2018年1月22日 22:58
編輯回答
不討囍
select查詢的時候盡量不要使用*
2018年6月12日 00:59