首页

【阅读分享】MySQL对于千万级的大表如何优化

标签:mysql优化     发布时间:2023-12-31   

1)优化你的sql、索引

> B+树@b@> sql优化@b@  避免多表联合查询,优化难度大@b@  设置合理的查询字段,避免多次回表@b@> 索引@b@  建立合适的索引@b@  避免索引失效

003_2024-01-01_00-01-30.png

默认是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) 引入缓存

002_2023-12-31_23-59-50.png

> 优点@b@	解决读的性能瓶颈@b@@b@> 缺点@b@	缓存数据库一致性@b@	缓存穿透@b@	缓存雪崩@b@	缓存击穿@b@	架构复杂(高可用)

3) 读写分离

004_2024-01-01_00-03-35.png

> 优点@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) 垂直拆分 

005_2024-01-01_00-07-20.png

> 优点@b@	拆分后业务清晰,拆分规则明确。@b@	系统之间整合或扩展容易。@b@	数据维护简单。@b@> 缺点@b@	部分业务表无法join,只能通过接口方式解决,提高了系统复杂度。@b@	受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高。@b@	事务处理复杂。

6) 水平切分

006_2024-01-01_00-08-46.png

> 优点@b@	优化单一表数据量过大而产生的性能问题@b@	避免IO争抢并减少锁表的几率@b@> 缺点@b@	主键避免重复(分布式Id)@b@	跨节点分页、排序函数@b@	数据多次扩展难度跟维护量极大
  • ◆ 相关内容