clickhouse 是 yandex(俄羅斯最大的搜尋引擎)開源的乙個用於實時資料分析的基於列儲存的資料庫,其處理資料的速度比傳統方法快 100-1000 倍。
clickhouse 的效能超過了目前市場上可比的面向列的 dbms,每秒鐘每台伺服器每秒處理數億至十億多行和數十千兆位元組的資料。
clickhouse 是什麼?
clickhouse 是乙個用於聯機分析(olap)的列式資料庫管理系統(dbms)。我們首先理清一些基礎概念:
oltp:是傳統的關係型資料庫,主要操作增刪改查,強調事務一致性,比如銀行系統、電商系統。
olap:是倉庫型資料庫,主要是讀取資料,做複雜資料分析,側重技術決策支援,提供直觀簡單的結果。
接著我們用圖示,來理解一下列式資料庫和行式資料庫區別,在傳統的行式資料庫系統中(mysql、postgres 和 ms sql server),資料按如下順序儲存:
在列式資料庫系統中(clickhouse),資料按如下的順序儲存:
兩者在儲存方式上對比:
業務問題
業務端現有儲存在 mysql 中,5000 萬資料量的大表及兩個輔表,單次聯表查詢開銷在 3min+,執行效率極低。
經過索引優化、水平分表、邏輯優化,成效較低,因此決定借助 clickhouse 來解決此問題。
clickhouse 實踐
②資料遷移:從 mysql 到 clickhouse
clickhouse 支援 mysql 大多數語法,遷移成本低,目前有五種遷移方案:
create table engin mysql,對映方案資料還是在 mysql。
insert into select from,先建表,在匯入。
create table as select from,建表同時匯入。
csv 離線匯入。
streamsets。
選擇第三種方案做資料遷移:
create table [if not exists] [db.]table_name engine = mergetree as select * from mysql('host:port', 'db', 'database', 'user', 'password')
③效能測試對比
效能測試對比如下圖:
④資料同步方案
臨時表如下:
新建 temp 中間表,將 mysql 資料全量同步到 clickhouse 內 temp 表,再替換原 clickhouse 中的表,適用資料量適度,增量和變數頻繁的場景。
synch 原理是通過 mysql 的 binlog 日誌,獲取 sql 語句,再通過訊息佇列消費 task。
⑤clickhouse 為什麼快?有如下幾點:只需要讀取要計算的列資料,而非行式的整行資料讀取,降低 io cost。
同列同型別,有十倍壓縮提公升,進一步降低 io。
clickhouse 根據不同儲存場景,做個性化搜尋演算法。
遇到的坑
①clickhouse 與 mysql 資料型別差異性用 mysql 的語句查詢,發現報錯:
解決方案:left join b b on touint32(h.id) = touint32(ec.post_id),中轉一下,統一無符號型別關聯
②刪除或更新是非同步執行,只保證最終一致性查詢 ck 手冊發現,即便對資料一致性支援最好的 mergetree,也只是保證最終一致性:
如果對資料一致性要求較高,推薦大家做全量同步來解決。
總結通過 clickhouse 實踐,完美的解決了 mysql 查詢瓶頸,20 億行以下資料量級查詢,90% 都可以在 1s 內給到結果,隨著資料量增加,clickhouse 同樣也支援集群,大家如果感興趣,可以積極嘗試!
資料庫查詢提公升查詢效率
在乙個千萬級別的資料庫查詢中,提公升查詢效率方法 對查詢優化,要盡量避免全表掃瞄,首先考慮在where和orderby涉及的列上建索引 應盡量避免在where字句中對null值進行判斷,否則導致引擎放棄索引而進行全表掃瞄,如 select id from t where num is null,可以...
查詢時權重提公升
在 語句優先順序 prioritizing clauses 中,我們解釋過如何在搜尋時使用boost引數讓乙個查詢語句比其他語句更重要。例如 search title查詢語句的重要性是content查詢的 2 倍,因為它的權重提公升值為2。沒有設定boost的查詢語句的值為1。查詢時的權重提公升 是...
提公升MySQL查詢效能常用套路
前言 我們查詢資料庫通常會多表關聯,當資料量大時,很多時候我們可以多表查詢分成多次 sql 查詢,來提高效能。如 select from tag join tag post on tag post.tag id tag.id join post on tag post.post id post.id...