ClickHouse的MySQL数据库引擎允许将MySQL表映射为ClickHouse表,实现跨引擎查询。以下是实现方法和关键特性:
一、基本语法
CREATE DATABASE [IF NOT EXISTS] db_name
ENGINE = MySQL('host:port', 'database', 'user', 'password')
二、完整示例
-- 1. 创建MySQL数据库引擎
CREATE DATABASE mysql_db
ENGINE = MySQL('192.168.1.100:3306', 'mysql_database', 'username', 'password')
-- 2. 查询MySQL表
SELECT * FROM mysql_db.mysql_table
-- 3. 创建本地表并导入数据
CREATE TABLE ch_local AS mysql_db.mysql_table
ENGINE = MergeTree()
ORDER BY id
-- 4. 插入数据
INSERT INTO ch_local
SELECT * FROM mysql_db.mysql_table
三、实现原理
1. 架构设计
ClickHouse ↔ MySQL引擎 ↔ MySQL协议 ↔ MySQL Server
↑ ↓
└── 查询解析转换
2. 数据类型映射
| MySQL类型 |
ClickHouse类型 |
|---|
| INT |
Int32 |
| BIGINT |
Int64 |
| VARCHAR |
String |
| DATETIME |
DateTime |
| DECIMAL |
Decimal |
| TEXT |
String |
四、高级用法
1. 实时同步
-- 创建物化视图实时同步
CREATE MATERIALIZED VIEW mysql_sync_view
ENGINE = MergeTree()
ORDER BY id AS
SELECT * FROM mysql_db.mysql_table
2. 条件查询
-- 带WHERE条件的跨库查询
SELECT * FROM mysql_db.mysql_table
WHERE date > '2024-01-01'
3. JOIN操作
-- ClickHouse表与MySQL表JOIN
SELECT ch.*, mysql.*
FROM clickhouse_table ch
LEFT JOIN mysql_db.mysql_table mysql ON ch.id = mysql.id
五、配置优化
1. 连接池设置(在users.xml中)
<mysql>
<connections_pool_size>16</connections_pool_size>
<connection_wait_timeout>10</connection_wait_timeout>
</mysql>
2. 性能优化参数
-- 设置并行度
SET max_threads = 8;
SET max_block_size = 65536;
-- 启用缓存
SET use_uncompressed_cache = 1;
六、注意事项
数据类型转换
- MySQL的UNSIGNED类型会转为有符号
- ENUM类型转为String
性能考虑
功能限制
- 不支持MySQL事务
- 不支持存储过程
- 索引无法直接使用
七、最佳实践
数据迁移场景
-- 分批迁移大数据表
INSERT INTO ch_table
SELECT * FROM mysql_db.large_table
WHERE id BETWEEN 1 AND 1000000
读写分离
-- 只读查询走MySQL引擎
-- 写入和复杂查询用ClickHouse本地表
监控查询
-- 查看MySQL引擎查询
SELECT * FROM system.query_log
WHERE query LIKE '%mysql_db%'
八、故障排查
连接问题
# 测试网络连通性
telnet mysql_host 3306
检查权限
mysql -h host -u user -p -e "SHOW GRANTS"
2. **性能问题**
```sql
-- 查看查询执行计划
EXPLAIN
SELECT * FROM mysql_db.table
-- 监控网络流量
SELECT * FROM system.events
WHERE event LIKE '%Network%'
MySQL引擎适合以下场景:
- 数据探查和临时分析
- 小规模数据迁移
- 实时性要求不高的查询
- 跨数据源联合分析
对于高性能场景,建议先将数据导入ClickHouse本地表后再进行分析。