1)优化你的sql、索引
> B+树@b@> sql优化@b@ 避免多表联合查询,优化难度大@b@ 设置合理的查询字段,避免多次回表@b@> 索引@b@ 建立合适的索引@b@ 避免索引失效
默认是B树索引,如B+树是使用USING BTREE,脚本如下
B树索引:sqlCopy codeCREATE INDEX idx_name ON my_table (name);
B+树索引:sqlCopy codeCREATE INDEX idx_name ON my_table (name) USING BTREE;
2) 引入缓存
> 优点@b@ 解决读的性能瓶颈@b@@b@> 缺点@b@ 缓存数据库一致性@b@ 缓存穿透@b@ 缓存雪崩@b@ 缓存击穿@b@ 架构复杂(高可用)
3) 读写分离
> 优点@b@ 分担主库的压力@b@@b@> 缺点@b@ 从延迟,导致往主库写入的数据跟从库读出来的数据不一致
4) 分区表
CREATE TABLE 'tab' (@b@ 'ftime' datetime NOT NULL,@b@ 'c' int(11) DEFAULT NULL,@b@ KEY ('ftime')@b@) ENGINE=InnoDB DEFAULT CHARSET=latin1@b@PARTITION BY RANGE (YEAR(ftime))@b@(PARTITION p_2017 VALUES LESS THAN (2017) ENGINE = InnoDB,@b@ PARTITION p_2018 VALUES LESS THAN (2018) ENGINE = InnoDB,@b@ PARTITION p_2019 VALUES LESS THAN (2019) ENGINE = InnoDB,@b@PARTITION p_others VALUES LESS THAN MAXVALUE ENGINE = InnoDB);@b@insert into tab values('2017-4-1',1),('2018-4-1',1);
这个表包含了一个.frm 文件和 4 个.ibd 文件,每个分区对应一个.ibd 文件。 对于引擎层来说,这是 4 个表; 对于 Server 层来说,这是 1 个表。
5) 垂直拆分
> 优点@b@ 拆分后业务清晰,拆分规则明确。@b@ 系统之间整合或扩展容易。@b@ 数据维护简单。@b@> 缺点@b@ 部分业务表无法join,只能通过接口方式解决,提高了系统复杂度。@b@ 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高。@b@ 事务处理复杂。
6) 水平切分
> 优点@b@ 优化单一表数据量过大而产生的性能问题@b@ 避免IO争抢并减少锁表的几率@b@> 缺点@b@ 主键避免重复(分布式Id)@b@ 跨节点分页、排序函数@b@ 数据多次扩展难度跟维护量极大