4 MySQl优化
大表优化
-
限定数据的范围
禁止不带任何限制数据范围的查询条件 -
读/写分离
数据库拆分,主库负责写,从库负责读 -
垂直分区
数据表列的拆分,把一张列比较多的表拆分为多张表
- 优点:可以使列数据变小,在查询时减少读取的Block数,减少I/O次数;还可以简化表的结构,易于维护
- 缺点:主键会出现冗余并会引起join操作,可以在应用层进行join来解决;会让事务更加复杂
- 水平分区
保持数据表结构不变,通过指定策略存储数据分片,也就是指数据表行的拆分
分表仅仅解决单一表数据过大的问题,如果依然是在同一台机器上,性能并没有优化多少,所以水平拆分最好是分库
水平拆分能够支持非常大的数据量存储,应用端改造也较少,但分片事务难以解决,跨点join性能较差,逻辑复杂
一般数据表在优化得当的情况下支持千万以下的数据量并没有太大的问题,如果实在要分片,尽量选择客户端分片架构,这样可以减少一次和中间件的网络IO
- 数据库分片常见方案
- 客户端代理:分片逻辑在应用端,封装在jar包中,通过修改或者封装JDBC层来实现
- 中间件代理:在应用和数据中间加了一个代理层,分片逻辑统一维护在中间件服务中
存储优化
- 尽量利用sql语句替代小循环,如聚合函数、平均函数等
- 中间结果存放于临时表,加索引
- 少使用游标,cursor是过程运算
- 事务越短越好
- 查找语句尽量不要放在循环内