From 456736f2a2dad6cd26bcc31109018565e782e04a Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Sat, 9 Jun 2018 16:01:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=A7=E8=A1=A8=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 数据存储/MySQL.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/数据存储/MySQL.md b/数据存储/MySQL.md index 44470b5c..8231c502 100644 --- a/数据存储/MySQL.md +++ b/数据存储/MySQL.md @@ -1,3 +1,5 @@ +Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):[https://github.com/Snailclimb/Java_Guide](https://github.com/Snailclimb/Java_Guide) + > ## 书籍推荐 **《高性能MySQL : 第3版》** @@ -109,3 +111,17 @@ 详细内容可以参考: [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) + \ No newline at end of file