Database
น้องๆ เคยเจอปัญหาข้อมูลเยอะแยะมากมาย แต่ดึงมาวิเคราะห์ทีนี่รอชาติหน้าเลยมั้ย? Clickhouse เนี่ยแหละคือพระเอกขี่ม้าขาวมาช่วยเราจัดการปัญหาพวกนี้ สมัยผมทำร้านเน็ต SiamCafe.net เนี่ย ข้อมูลลูกค้า ข้อมูลเกม ข้อมูลการใช้งานเพียบ! ถ้าไม่มีเครื่องมือดีๆ นี่ตายสถานเดียว
Clickhouse คือ Database Management System (DBMS) ประเภท Column-Oriented Database Management System (Columnar Database) พูดง่ายๆ คือ มันเก็บข้อมูลเป็น "คอลัมน์" แทนที่จะเป็น "แถว" เหมือน Database ทั่วไปที่เราคุ้นเคย (เช่น MySQL, PostgreSQL) แล้วมันดียังไง? เดี๋ยวมาดูกัน
สำคัญยังไงน่ะเหรอ? ถ้าเราต้องการวิเคราะห์ข้อมูลจำนวนมหาศาล (Big Data) Clickhouse จะเร็วกว่า Database แบบเดิมๆ มาก เพราะมันอ่านเฉพาะคอลัมน์ที่เราสนใจเท่านั้น ไม่ต้องไปอ่านข้อมูลทั้งแถวให้เสียเวลา เหมาะกับการทำ Analytics สุดๆ
อย่างที่บอกไป Columnar Database เก็บข้อมูลเป็นคอลัมน์ ลองนึกภาพ Excel แถวคือ Record คอลัมน์คือ Field ธรรมดาๆ นี่แหละ แต่ข้างในมันสลับกันเก็บข้อมูล สมมติเรามีตารางข้อมูลลูกค้า:
+----------+-------+---------+
| Name | Age | City |
+----------+-------+---------+
| Alice | 30 | Bangkok |
| Bob | 25 | Chiang Mai|
| Charlie | 35 | Phuket |
+----------+-------+---------+
Row-Oriented Database (เช่น MySQL) จะเก็บข้อมูลแบบนี้: (Alice, 30, Bangkok), (Bob, 25, Chiang Mai), (Charlie, 35, Phuket)
Columnar Database (เช่น Clickhouse) จะเก็บข้อมูลแบบนี้: (Alice, Bob, Charlie), (30, 25, 35), (Bangkok, Chiang Mai, Phuket)
ถ้าเราต้องการหาค่าเฉลี่ยอายุของลูกค้า Columnar Database จะอ่านแค่คอลัมน์ "Age" เท่านั้น ทำให้เร็วกว่า Row-Oriented Database ที่ต้องอ่านทุกแถว
ก่อนจะไปต่อ ต้องรู้จัก OLAP (Online Analytical Processing) กับ OLTP (Online Transaction Processing) ก่อนนะ
Clickhouse ถูกออกแบบมาเพื่อ OLAP โดยเฉพาะ เพราะฉะนั้นอย่าเอาไปใช้ทำ Transaction นะ เดี๋ยวงานเข้า!
ข้อมูลเยอะมากๆ แค่ Columnar Database อย่างเดียวอาจจะไม่พอ เราต้องใช้เทคนิค Data Partitioning และ Sharding เข้ามาช่วย
การทำ Partitioning และ Sharding จะช่วยให้ Clickhouse ทำงานได้เร็วขึ้นมากๆ โดยเฉพาะกับข้อมูลขนาดใหญ่
เอาล่ะ มาถึงขั้นตอนการใช้งานจริงกันบ้าง Clickhouse ไม่ได้ยากอย่างที่คิดนะ สมัยผมทำ SiamCafe.net ก็ลองผิดลองถูกมาเยอะ แต่รับรองว่าน้องๆ ทำตามได้แน่นอน
ก่อนอื่นต้องติดตั้ง Clickhouse ก่อน ซึ่งมีให้เลือกหลายวิธี ทั้งแบบติดตั้งเองบน Server หรือใช้ Cloud Service (เช่น AWS, Google Cloud, Azure) ผมแนะนำให้ลองติดตั้งบน Local Machine ก่อนก็ได้ จะได้ลองเล่นง่ายๆ
หลังจากติดตั้งเสร็จแล้ว เราก็ต้องสร้าง Database และ Table เพื่อเก็บข้อมูล
วิธีการติดตั้ง Clickhouse จะแตกต่างกันไปตามระบบปฏิบัติการ (Operating System) แต่โดยทั่วไปแล้วจะมีขั้นตอนคล้ายๆ กัน
หลังจากติดตั้งเสร็จแล้ว เราสามารถ Connect ไปยัง Clickhouse Server ได้โดยใช้ Command-Line Client หรือ GUI Client (เช่น DBeaver)
เมื่อ Connect ไปยัง Clickhouse Server แล้ว เราก็สามารถสร้าง Database และ Table ได้โดยใช้ SQL Command
-- สร้าง Database
CREATE DATABASE my_database;
-- ใช้ Database
USE my_database;
-- สร้าง Table
CREATE TABLE my_table (
id UInt64,
name String,
age UInt8,
city String
) ENGINE = MergeTree()
ORDER BY id;
คำสั่ง CREATE TABLE จะสร้าง Table ชื่อ my_table ที่มี Column id, name, age, และ city
ENGINE = MergeTree() คือ Engine ที่ใช้ในการเก็บข้อมูล ซึ่งเป็น Engine ที่นิยมใช้กันใน Clickhouse เพราะมีประสิทธิภาพสูง
ORDER BY id คือการกำหนด Order ของข้อมูลใน Table ซึ่งจะช่วยให้การ Query ข้อมูลเร็วขึ้น
หลังจากสร้าง Table เสร็จแล้ว เราก็สามารถ Insert และ Query ข้อมูลได้โดยใช้ SQL Command
-- Insert ข้อมูล
INSERT INTO my_table (id, name, age, city) VALUES
(1, 'Alice', 30, 'Bangkok'),
(2, 'Bob', 25, 'Chiang Mai'),
(3, 'Charlie', 35, 'Phuket');
-- Query ข้อมูล
SELECT * FROM my_table WHERE age > 25;
คำสั่ง INSERT INTO จะ Insert ข้อมูลลงใน Table my_table
คำสั่ง SELECT จะ Query ข้อมูลจาก Table my_table โดยมีเงื่อนไข age > 25
ลองเล่นดูนะน้องๆ สนุกแน่นอน! ถ้าติดขัดตรงไหน ลองเข้าไปดูใน SiamCafe Blog อาจจะมีคำตอบที่น้องๆ กำลังหาอยู่ก็ได้
ดูวิดีโอเพิ่มเติมเกี่ยวกับClickhouse Analytics Database Guide:
Clickhouse ไม่ใช่ Database ตัวเดียวในโลก ยังมีทางเลือกอื่นๆ อีกมากมาย แต่ละตัวก็มีข้อดีข้อเสียแตกต่างกันไป เรามาดูกันว่า Clickhouse แตกต่างจากทางเลือกอื่นๆ ยังไง
สมัยผมทำร้านเน็ตเนี่ย เคยลองใช้มาหลายตัว สุดท้ายก็มาจบที่ Clickhouse เพราะตอบโจทย์เรื่องความเร็วในการวิเคราะห์ข้อมูลมากที่สุด
| Database | ประเภท | ข้อดี | ข้อเสีย | เหมาะกับ |
|---|---|---|---|---|
| Clickhouse | Column-Oriented | เร็วมากในการวิเคราะห์ข้อมูล, รองรับข้อมูลขนาดใหญ่ | ไม่เหมาะกับการทำ Transaction, Learning Curve สูง | Analytics, Data Warehousing |
| MySQL | Row-Oriented | ใช้งานง่าย, Community ใหญ่, มีเครื่องมือเยอะ | ช้าในการวิเคราะห์ข้อมูลขนาดใหญ่ | Web Application, Transactional System |
| PostgreSQL | Row-Oriented | รองรับ SQL Standard, มี Feature เยอะ, Open Source | ช้าในการวิเคราะห์ข้อมูลขนาดใหญ่ | Web Application, Data Warehousing (ขนาดเล็ก) |
| BigQuery | Column-Oriented (Cloud) | ไม่ต้องดูแล Infrastructure, Scale ได้ง่าย | ค่าใช้จ่ายสูง, Vendor Lock-in | Analytics (บน Cloud), Data Warehousing |
จากตารางจะเห็นว่า Clickhouse เหมาะกับการทำ Analytics และ Data Warehousing มากกว่า Database ตัวอื่นๆ แต่ก็มีข้อเสียคือไม่เหมาะกับการทำ Transaction และ Learning Curve สูง
ถ้าใครสนใจเรื่อง Database หรือเรื่อง IT อื่นๆ ลองแวะไปอ่านบทความใน SiamCafe Blog ได้นะ ผมเขียนไว้เยอะแยะเลย!
เอาล่ะ มาถึงส่วนที่สำคัญที่สุด คือเคล็ดลับที่ผมสั่งสมมาจากการใช้งาน ClickHouse จริงๆ จังๆ สมัยทำ SiamCafe.net น่ะแหละ บอกเลยว่าของพวกนี้ หาอ่านตาม documentation ยาก ต้องเจ็บจริงถึงจะรู้!
ClickHouse มันแรงก็จริง แต่ถ้าใช้ไม่ถูกวิธี มันก็พังได้เหมือนกันนะน้อง
อันนี้สำคัญสุดๆ น้องเอ๊ย! ClickHouse มันมี Storage Engine ให้เลือกเยอะมาก ตั้งแต่ MergeTree ไปจนถึง Memory Engine แต่ละตัวมันมีข้อดีข้อเสียต่างกัน ถ้าเลือกผิดชีวิตเปลี่ยนเลยนะ
สมัยผมทำร้านเน็ต เคยเจอเคสที่ลูกค้าอยากเก็บ Log แบบละเอียดทุกวินาที แล้วดันไปใช้ MergeTree ธรรมดา ผลคือ… Server CPU 100% ตลอดเวลา เพราะมัน Merge Data ไม่ทัน สุดท้ายต้องเปลี่ยนไปใช้ ReplacingMergeTree ถึงจะรอด เพราะมันยอมทิ้งข้อมูลเก่าที่ไม่จำเป็นออกไปบ้าง
ClickHouse มันใช้ Columnar Storage ซึ่งทำให้การ Query ข้อมูลบางอย่างเร็วมากๆ แต่ถ้า Query แบบไม่ Optimize มันก็ช้าได้เหมือนกันนะ
สิ่งที่ต้องทำคือ สร้าง Index ให้ถูกจุด และ Partition Table ให้เหมาะสมกับลักษณะการ Query ของเรา สมมติว่าเรา Query ข้อมูลตามวันที่บ่อยๆ ก็ควร Partition Table ตามวันที่ไปเลย เวลา Query มันจะได้ Scan แค่ Partition ที่เกี่ยวข้องเท่านั้น เร็วกว่าเดิมเยอะ!
อย่า Insert Data ทีละ Row เด็ดขาด! ClickHouse มันออกแบบมาให้ Insert Data เป็น Batch ใหญ่ๆ ถ้า Insert ทีละ Row มันจะเสียเวลาในการจัดการ Internal Structures เยอะมาก
สมัยก่อนผมเคยเขียน Script ดึงข้อมูลจาก MySQL แล้ว Insert เข้า ClickHouse ทีละ Row ปรากฏว่า Process มันช้ามากๆ พอเปลี่ยนเป็น Insert แบบ Batch (1000 Rows ต่อ Batch) Process เร็วขึ้นเป็นสิบเท่าเลย
-- ตัวอย่างการ Insert แบบ Batch
INSERT INTO my_table VALUES
(1, 'data1'),
(2, 'data2'),
(3, 'data3');
อันนี้สำคัญมากๆ น้องต้องคอย Monitor Performance ของ ClickHouse อยู่เสมอ ดูว่า CPU, Memory, Disk I/O มันทำงานหนักเกินไปหรือเปล่า มี Query ไหนที่ใช้เวลานานผิดปกติหรือเปล่า
ClickHouse มันมี System Tables ที่ให้ข้อมูล Performance ต่างๆ มากมาย ลองเข้าไปศึกษาดู แล้วเขียน Dashboard สวยๆ มา Monitor จะช่วยให้เราแก้ปัญหาได้ทันท่วงที
ClickHouse เหมาะกับงาน Analytics ที่ต้องการ Query ข้อมูลจำนวนมหาศาลอย่างรวดเร็ว เช่น Clickstream Analysis, Log Analysis, Business Intelligence แต่ไม่เหมาะกับงาน Transactional ที่ต้องการความถูกต้องของข้อมูลแบบ Real-time
ClickHouse เป็น Columnar Database ในขณะที่ Relational Database เป็น Row-based Database ทำให้ ClickHouse Query ข้อมูลบางอย่างได้เร็วกว่ามาก แต่ Relational Database จะเก่งเรื่อง Transaction และ Integrity ของข้อมูลมากกว่า
ได้สิ! ClickHouse มี Engine ที่ชื่อ MySQL Engine ที่สามารถ Connect ไปยัง MySQL แล้ว Query ข้อมูลจาก Table ใน MySQL ได้โดยตรง แต่ก็ต้องระวังเรื่อง Performance ด้วย เพราะมันต้องดึงข้อมูลข้าม Database
ClickHouse มี Community ที่แข็งแกร่ง มี Forum, Slack Channel, และ Documentation ที่ดีมากๆ ถ้าเจอปัญหาอะไร ก็สามารถเข้าไปถามใน Community ได้เลย
ClickHouse เป็น Database ที่ทรงพลัง เหมาะสำหรับงาน Analytics ที่ต้องการความเร็ว แต่ก็ต้องศึกษาและทำความเข้าใจมันอย่างละเอียดก่อนใช้งานจริง ไม่งั้นอาจจะเจอปัญหาที่ไม่คาดฝันได้
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะครับ ถ้ามีคำถามอะไรเพิ่มเติม ก็ถามมาได้เลย SiamCafe Blog ยังมีบทความดีๆ อีกเยอะแยะ
อย่าลืมแวะไปดู iCafeForex ด้วยนะ เผื่อใครสนใจเรื่อง Forex