超快速的資料庫系統 – Clickhouse

前言

過去幾年我一直使用 MySQL 作為我主要的資料庫引擎,也是各種學校補習班會教的引擎。不過隨著年紀及經驗的增長,你就會覺得 MySQL 處理大資料的時候非常遲鈍。舉個例子好了,當你在幾百萬筆資料裡面進行查詢,大多數時間 MySQL 都要花上的幾十秒來處理。

某天睡前,照慣例的滑手機。我很喜歡看 Google App 裡面的各種新聞資訊。突然間讓我看到一篇介紹 Clickhouse 的文章。來自俄羅斯,並號稱速度極快,連阿里巴巴的雙 11 活動都是交給他處理的。直接引起我非常大的興趣。

到底有多快

口說無憑,但他到底有多快?我的其中一個服務會記錄下直播平台 Twitch 的聊天室內容供實況主們檢核使用。這個資料量夠大,所以我隨便 Query 幾個內容。

001.jpg

在將近 700 萬筆資料中查詢,他只花費 0.036 秒就給出了結果,屬實神速!

安裝步驟

我們在 Linux 中安裝他,只需要一行命令。

curl https://clickhouse.com/ | sh

跑完後,接著安裝他。

sudo ./clickhouse install

過程中他會詢問你幾個問題,如下:

Enter password for default user:
# 請輸入一個密碼供預設使用者使用
Allow server to accept connections from the network (default is localhost only), [y/N]:
# 接受來自網路的連線嗎 (預設只允許本機)

完成後,我們可以透過 sudo clickhouse start 來讓他執行。注意:Clickhouse 不會在開機時自動啟動,你可以透過任何方法自己呼叫這個命令。像我是寫在 crontab 裡面隨開機啟動。

這樣就安裝完了,我第一次操作的時候也覺得:怎麼這麼容易…。

使用 clickhouse-client

在安裝過程中,他實際上會安裝兩個東西,clickhouse-server 以及 clickhouse-clientclickhouse-server 就是供資料庫運作的地方,而 clickhouse-client 就是我們可以進行 SQL Query 的地方。

在畫面上,我們輸入以下命令,並輸入剛剛設定完的密碼,即可使用。

sudo clickhouse-client

接著你就可以在這裡開始使用 SQL 命令了,大部分以前在 MySQL 的語法,這裡都可以使用。

002.jpg

使用 MySQL 客戶端

Clickhouse 具有相容於 MySQL 的協定,所以你也可以使用 MySQL 的客戶端使用他。

如果你還沒安裝,你可以透過以下命令來安裝 MySQL 客戶端。

sudo apt install -y default-mysql-client

Clickhouse 會在 Port 9004 監聽運作 MySQL Protocol,預設的使用者名稱為 default。所以你可以使用這行命令來透過 MySQL 客戶端使用。

mysql --protocol tcp -P 9004 -u default -p

順利登入。

003.jpg

寫入資料

當你在 Clickhouse 建置完資料庫與資料表後,我們如何寫入資料呢?在上面的章節我們提到,Clickhouse 是相容於 MySQL 協定的。這意味著,如果你過往的程式碼是基於 MySQL 寫的,那你只需要改變一點程式碼就可以直接在 Clickhouse 上運作,相當方便。

這邊提供幾個語言的程式碼參考,讓你快速的與 Clickhouse 連上線。

PHP

$DB_HOST = '192.168.0.1:9004'; // 主機 IP,記得加上 Port 9004
$DB_USER = 'user';             // 帳號
$DB_PASS = 'password';         // 密碼
$DB_NAME = 'mydb';             // 資料庫名稱

$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($conn->connect_error) die("連線到資料庫發生錯誤。請稍後再試。");
$conn->set_charset('utf8mb4');

NodeJs

const mysql = require('mysql2');

var pool  = mysql.createPool({
    connectionLimit : 10, // Connection Pool 數量
    host: '192.168.0.1',  // IP 位址
    port: 9004,           // Port,Clickhouse 預設為 9004
    user: 'user',         // 帳號
    password: 'password', // 密碼
    database: 'mydb'      // 資料庫名稱
});

常見問題

以下將列出我使用 Clickhouse 上遇到的問題以及解決方式,我會持續在這裡更新。

解決 Clickhouse 無限膨脹的 Log

檢視 Clickhouse 每張表的使用大小

在 Clickhouse 建立一個使用者

結語

這就是 Clickhouse 的安裝過程啦。其他部分的使用上基本上語法都可以像是 MySQL 那樣使用,差別在於:他真的很快!