簡體   English   中英

用 where 子句計算大 MySQL 表上的最后一條記錄

[英]Count with where clause only 100k last records on big MySQL table

我在我們的數據庫中有一個包含超過 2000 萬條記錄的表。 該表每天平均增長 100.000 條記錄。 我需要對該表進行計數,最多只需要掃描 24 小時的記錄(平均 100k) 我的一般方法:

  1. 獲取表上的最新 id (Long maxId = SELECT MAX(acc.id) FROM MyTable as acc WHERE 1 ),因為這非常快。
  2. 計算間隔: Long tolerableMin = maxId - 100000
  3. 然后做第二個SELECT count(*) FROM MyTable as acc " + " WHERE acc.X = 'SomeValue' + " AND acc.Y = 'OtherVal' + " AND acc.id > " + tolerableMin + " ORDER BY id DESC .

這個平均執行時間約為 2 秒。 當我使用 where 子句執行直接 count(x) 但acc.id > X沒有條件時,查詢掛起超過 15 秒。 我的問題是:

  1. 這種方法是最優的嗎?
  2. 我錯過了什么嗎? 任何提示?

注意:我在 Java/Hibernate 后端和 MySQL 中使用它作為數據庫服務器。

這是一個完全不用計算的完美場景

我寧願創建一個觸發器來單獨填充具有計數器的表,如果您不喜歡觸發器,請考慮讓表和作業在后台不時填充它。

在現實生活中確實很少有真正需要實時數據的情況,有時 30 分鍾到幾個小時就可以更新這樣的計數器

另一個頭腦風暴的想法是使用 solr 或任何其他 NoSQL 來索引您需要計算的所有這些數據,在 nosql 中存儲會更快,然后
我沒有看到任何更好的方法來使用如此大的 SQL 表上的正常計數來加速它

計划 A: INDEX(x,y,id)並折騰ORDER BY

計划 B:您只想要最后 24 小時的價值,但時間戳在哪里? 也許那是x 然后INDEX(timestamp, y)並折騰ORDER BY

計划C:構建和維護“匯總表”: http://mysql.rjweb.org/doc.php/summarytables

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM