ClickHouse 使用 MySql Database Engine

之前筆記 ClickHouse 在彙總資料時的效能優勢 紀錄到 ClickHouse 與 MySql 在特定查詢情境的效能差異,查閱官網文件時,發現 ClickHouse 除了支援自有的 table engine 之外,也支援其他 DB 的 engine 其中還有兩種類型:Database EngineTable Engine,所以今天就來紀錄一下 ClickHouse 如何使用 MySql Database Engine 與 MySql Table Engine 之間的效能差異

基本環境說明

  1. macOS Sonoma 14.2.1 (Apple M2 Pro)
  2. OrbStack Version 1.2.0 (16496)
  3. .NET SDK 8.0.100
  4. JetBrains Rider 2023.3.2
  5. Container Images

    • clickhouse/clickhouse-server:23.11.3.23
    • mysql:8.2
  6. NuGet Library

    • BenchmarkDotNet 0.13.12
    • ClickHouse.Client 7.0.0
    • MySql.Data 8.3.0
  7. docker-compose.yml

  8. MySql DDL

  9. 測試資料

    產生一億筆資料

設定方式

  1. Database Engine

    詳細內容請參考官網文件 DatabaseEngines:MySQL

    • 語法

    • 範例

  2. Table Engine

    詳細內容請參考官網文件 TableEngin:MySQL

    • 語法

    • 範例

效能比較

  1. 程式碼

  2. 比較結果

    1benchmark

心得

  1. 僅支援以下 data type,其他 MySQL data type 皆會被視為 string,使用時需要自行做型別轉換,難免會有效能耗損的問題

    MySQLClickHouse
    UNSIGNED TINYINTUInt8
    TINYINTInt8
    UNSIGNED SMALLINTUInt16
    SMALLINTInt16
    UNSIGNED INT, UNSIGNED MEDIUMINTUInt32
    INT, MEDIUMINTInt32
    UNSIGNED BIGINTUInt64
    BIGINTInt64
    FLOATFloat32
    DOUBLEFloat64
    DATEDate
    DATETIME, TIMESTAMPDateTime
    BINARYFixedString
  2. 原本想要比照之前筆記 :依時間區間過濾資料,但我嘗試了 BETWEEN>=<=,都無法正確查到資料,不知道是我使用方式不對,還是 mysql engine 對於 date 的比對有額外的處理方式,所以就先不將這個部分納入比較

  3. 雖然簡單的 WHERE 相關條件 (=, !=, >, >=, <, <=) 是在 MySQL 上執行,但相同查詢在 ClickHouse 相較於 MySQL 快上近 50%,雖然比不上直接查詢 ClickHouse 動輒幾十甚至上百倍的差距,但也不失為一個選擇

  4. ClickHouse MySql engine (database engine 與 table engine) 都支援 SELECTINSERT 指令,但 RENAMECREATE TABLEALTER 則不行

完整程式碼請參考:GitHub:yowko/ClickHouseMySqlEngineBenchmark

參考資訊

  1. ClickHouse 在彙總資料時的效能優勢
  2. DatabaseEngines:MySQL
  3. TableEngin:MySQL
  4. GitHub:yowko/ClickHouseMySqlEngineBenchmark