范围说明:本文档只收录 不新增索引、不改表结构、仅靠改写SQL本身 就能拿到显著性能收益的案例。每个案例包含:问题场景、根因分析、改写方案、生效的前提条件、以及如何用 EXPLAIN 验证效果。默认以 MySQL 8.0 / InnoDB 为背景,个别案例会注明与 PostgreSQL 的差异。 案例一:深分页 —— 延迟关联(Deferred Join) 场景 订单表按状态筛选后翻到很靠后的页码,是后台管理系统里最常见的慢查询之一。 CREATE TABLE orders ( id BIGINT PRIMARY KEY , customer_id BIGINT NOT NULL , status VARCHAR ( 20 ) NOT NULL , create_time DATETIME NOT NULL , buyer_name VARCHAR ( 50 ), address VARCHAR ( 200 ), remark VARCHAR ( 500 ) -- 其余字段省略,实际共30+列 ); CREATE INDEX idx_status_time ON orders( status , create_time); SELECT * FROM orders WHERE status = 'shipped' ORDER BY create_time LIMIT 1000000 , 20 ; 根因 idx_status_time 是二级索引,叶子节点只存 (status, create_time, id) ,不含其余字段。执行过程是: 1. 在二级索引上定位 status='shipped' 的记录,按 create_time 排序; 2. 每扫到一行,都要拿 id 回聚簇索引取完整行(回表); 3. 前 1,000,000 行取出来后 直接丢弃 ,只保留最后 20 行。 问题的本质不是"排序慢",而是 做了 1,000,020 次没必要的回表 I/O 。 改写 SELECT o.* FROM ...
ClickHouse 与 MySQL 对比指南 —— 写给有 MySQL 经验的用户 一、先说结论:两者根本不是同一类数据库 理解 ClickHouse 最容易踩的坑,就是把它当成"性能更强的 MySQL"。实际上两者的设计目标完全不同: 维度 MySQL ClickHouse 定位 OLTP(联机事务处理) OLAP(联机分析处理) 典型场景 下单、支付、用户信息增删改查 日志分析、报表、BI、时序数据、用户行为分析 存储方式 行式存储(row-based) 列式存储(column-based) 单次查询数据量 少量行,高频次 大量行,低频次但计算量大 事务 完整 ACID 事务 不支持传统事务,写入近似"追加" 单条数据修改 高效(UPDATE/DELETE 直接改) 低效,官方不推荐频繁做 一句话理解: MySQL 擅长"找到某一行/几行数据并精确修改",ClickHouse 擅长"扫描亿万行数据做聚合计算"。 二、使用方式与功能对比 2.1 建表语法差异 MySQL: CREATE TABLE orders ( id BIGINT AUTO_INCREMENT PRIMARY KEY , user_id BIGINT , amount DECIMAL ( 10 , 2 ), created_at DATETIME ) ENGINE = InnoDB ; ClickHouse: CREATE TABLE orders ( id UInt64, user_id UInt64, amount Decimal ( 10 , 2 ), created_at DateTime ) ENGINE = MergeTree() ORDER BY (user_id, created_at) PARTITION BY toYYYYMM(created_at); 几个关键差异点: 没有 AUTO_INCREMENT :ClickHouse 没有自增主键的概念,通常用雪花算法、UUID 或业务自带的唯一键。 ...