1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

增加大表优化内容

This commit is contained in:
Snailclimb 2018-06-09 16:01:19 +08:00
parent 8312dce6b8
commit 456736f2a2

View File

@ -1,3 +1,5 @@
Java面试通关手册Java学习指南欢迎Star会一直完善下去欢迎建议和指导[https://github.com/Snailclimb/Java_Guide](https://github.com/Snailclimb/Java_Guide)
> ## 书籍推荐 > ## 书籍推荐
**《高性能MySQL : 第3版》** **《高性能MySQL : 第3版》**
@ -109,3 +111,17 @@
详细内容可以参考: 详细内容可以参考:
[Mysql锁机制简单了解一下](https://blog.csdn.net/qq_34337272/article/details/80611486) [Mysql锁机制简单了解一下](https://blog.csdn.net/qq_34337272/article/details/80611486)
- ### 大表优化
当MySQL单表记录数过大时数据库的CRUD性能会明显下降一些常见的优化措施如下
1. **限定数据的范围:** 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。;
2. **读/写分离:** 经典的数据库拆分方案,主库负责写,从库负责读;
3. **缓存:** 使用MySQL的缓存另外对重量级、更新少的数据可以考虑使用应用级别的缓存
4. **垂直分区:** 根据数据库里面数据表的相关性进行拆分。例如用户表中既有用户的登录信息又有用户的基本信息可以将用户表拆分成两个单独的表甚至放到单独的库做分库。垂直分区的优点在于可以使得行数据变小在查询时减少读取的Block数减少I/O次数。此外垂直分区可以简化表的结构易于维护。
垂直分区的缺点在于主键会出现冗余需要管理冗余列并会引起Join操作可以通过在应用层进行Join来解决。此外垂直分区会让事务变得更加复杂
5. **水平分区:** 保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。水品分区可以支持非常大的数据量。需要注意的一点是:分表仅仅是解决了单一表数据过大的问题但由于表的数据还是在同一台机器上其实对于提升MySQL并发能力没有什么意义所以水品分区最好分库。水品分区能够支持非常大的数据量存储应用端改造也少但分片事务难以解决跨界点Join性能较差逻辑复杂。《Java工程师修炼之道》的作者推荐尽量不要对数据进行分片拆分会带来逻辑、部署、运维的各种复杂度一般的数据表在优化得当的情况下支撑千万以下的数据量是没有太大问题的。如果实在要分片尽量选择客户端分片架构这样可以减少一次和中间件的网络I/O。
详细内容可以参考:
[MySQL大表优化方案](https://segmentfault.com/a/1190000006158186)