mysql/ClickHouse limit M,N數據不穩定問題

1. 遇到問題:

在clickhouse,我有一個web3_data表,大概36w條記錄,以下查詢的數據會變:

select * from (
      SELECT space_id, user_address, attr_name, attr_value FROM web3_data LIMIT 65500, 500 
)as a 
where user_address = '0xa047e62cede767ef25d4b5700df5e42a71d3b3e4'

 第一次查詢沒有得到數據:

多查幾次居然能夠得到數據:

請教高手之後才知道僅僅只有limit,數據是不穩定的。

 

2. 原因:

SELECT space_id, user_address, attr_name, attr_value FROM web3_data LIMIT 90000, 500 查詢的結果在每次執行時可能會有所變化,這是由於數據庫中數據的插入、更新或刪除等操作導致的。

數據庫中的數據是動態的,當您執行查詢時,數據可能已經發生了變化。如果在執行查詢之間進行了數據插入、更新或刪除操作,結果集中的數據可能會發生變化。

如果您希望保持結果集的穩定性,可以考慮根據某個唯一標識符或其他穩定的排序條件進行排序,然後使用 LIMIT 子句來限制結果集的大小。這樣可以保證從結果集中獲取的數據是一致的。

例如,您可以使用類似以下的查詢來獲得穩定的結果集:

 
SELECT space_id, user_address, attr_name, attr_value
FROM web3_data
ORDER BY space_id
LIMIT 65500, 500

在上述查詢中,我們根據 space_id 列進行排序,然後使用 LIMIT 子句來限制結果集的大小。通過指定穩定的排序條件,您可以獲得一致的結果集。

數據在數據庫中的存儲和組織方式決定了它們在查詢結果中的順序。數據庫表中的數據通常是按照它們被插入的順序存儲的,但並不意味着查詢結果會按照插入的順序返回。

以下是一些影響查詢結果順序的因素:

  1. 插入順序:在表中插入新的記錄時,數據庫引擎通常會將它們追加到表的末尾或適當的數據頁中。這意味着新插入的記錄可能會出現在查詢結果的末尾,並不一定按照插入的順序返回。

  2. 更新操作:如果執行了針對表中現有記錄的更新操作,這些操作可能會導致記錄在物理存儲中的位置發生變化,從而影響查詢結果的順序。

  3. 刪除操作:執行刪除操作會從表中移除記錄,這可能會導致其他記錄在物理存儲中的重新組織和移動,進而影響查詢結果的順序。

  4. 索引:如果在查詢中使用了索引,數據庫引擎可能會使用索引來加速查詢,而不是按照數據的物理存儲順序返回結果。

綜上所述,查詢結果並不是按照數據插入的順序返回的,而是由數據庫引擎根據數據的存儲和組織方式以及查詢的條件和索引來決定的。

如果您需要按照特定的順序返回結果,可以使用 ORDER BY 子句來指定排序條件。通過指定適當的排序條件,您可以確保結果集按照您所需的順序返回。

3. 解決:

增加order by,這樣數據庫就有序了。

SELECT space_id, user_address, attr_name, attr_value
FROM web3_data
ORDER BY space_id
LIMIT 65500, 500

 

參考文檔:

https://juejin.cn/post/6864837626353074190

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章