clickHouse-golang

clickHouse优势与劣势

ClickHouse和传统的MySQL在设计和使用场景上有一些显著的区别,因此它们各自具有不同的优势和劣势。

ClickHouse的优势:

分布式架构:ClickHouse是为大数据分析而设计的分布式列存储数据库,可以方便地处理海量数据并支持高并发查询。
高性能:ClickHouse在数据分析场景下具有出色的查询性能,特别是针对聚合查询和大规模数据集的查询。
列存储:ClickHouse采用列存储结构,适合于大规模数据的聚合查询,能够显著减少I/O操作,提高查询速度。
优化查询引擎:ClickHouse针对大规模数据分析场景进行了优化,支持高效的数据压缩和并行查询。
灵活的水平扩展:ClickHouse易于水平扩展,可以通过添加更多的节点来增加存储容量和查询吞吐量。
ClickHouse的劣势:

不适合OLTP场景:相对于传统的关系型数据库(如MySQL),ClickHouse不适合用于需要频繁更新和事务处理的OLTP场景。
复杂性:ClickHouse的配置和管理相对复杂,特别是对于初学者来说,可能需要花费一些时间来学习和理解其工作原理和最佳实践。
功能较为专一:ClickHouse更专注于大规模数据的分析查询,对于其他类型的数据库操作(如事务处理)支持较弱。

docker-compose安装

version: '3.0'
services:
  clickhouse:
    image: bitnami/clickhouse:23
    ports:
      - "8123:8123"  # 客户端访问端口
      - "9000:9000"  # 内部数据端口
    volumes:
      - ./data:/bitnami/clickhouse
#      - /path/to/clickhouse/conf:/opt/bitnami/clickhouse/config
    environment:
      - CLICKHOUSE_USER=root  # 设置ClickHouse用户名
      - CLICKHOUSE_PASSWORD=123456  # 设置ClickHouse密码

golang操作clickHouse

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/ClickHouse/clickhouse-go"
)

var connect *sql.DB

func initDb() {
	conn, err := sql.Open("clickhouse", "tcp://localhost:9000?username=root&password=123456&database=default&block_size=4096")
	if err != nil {
		fmt.Println("连接失败:", err)
		return
	}
	connect = conn
}

func createTable() {
	_, err := connect.Exec("CREATE TABLE bike (id Int32, value String) ENGINE = Memory")
	if err != nil {
		fmt.Println("创建表失败:", err)
		return
	}
}

func Insert() {
	tx, err := connect.Begin()
	if err != nil {
		fmt.Println("开启事务失败:", err)
		return
	}

	stmt, err := tx.Prepare("INSERT INTO bike (id, value) VALUES (?, ?)")
	if err != nil {
		fmt.Println("准备插入语句失败:", err)
		return
	}

	_, err = stmt.Exec(1, "特斯拉")
	if err != nil {
		fmt.Println("插入数据失败:", err)
		return
	}

	_, err = stmt.Exec(2, "小米汽车")
	if err != nil {
		fmt.Println("插入数据失败:", err)
		return
	}

	err = tx.Commit()
	if err != nil {
		fmt.Println("提交事务失败:", err)
		return
	}
}

func QuerySelect() {
	rows, err := connect.Query("SELECT id,value FROM bike")
	if err != nil {
		fmt.Println("查询数据失败:", err)
		return
	}
	defer rows.Close()

	type Bike struct {
		Id    int    `json:"id"`
		Value string `json:"value"`
	}
	for rows.Next() {
		u := Bike{}

		err = rows.Scan(&u.Id, &u.Value)
		if err != nil {
			fmt.Println("扫描结果失败:", err)
			return
		}
		fmt.Println(u)
	}
}

func main() {
	initDb()
	//createTable()
	//Insert()
	QuerySelect()
}

posted @ 2023-11-16 10:20  Jeff的技术栈  阅读(310)  评论(0编辑  收藏  举报
回顶部