网站首页 > 精选文章 正文
个人的观点,这种大表的优化,不一定上来就要分库分表,因为表一旦被拆分,开发、运维的复杂度会直线上升,而大多数公司和开发人员是欠缺这种能力的。
所以MySQL中几百万甚至小几千万的表,先考虑做单表的优化。
单表优化
单表优化可以从这几个角度出发:
1.表分区
MySQL在5.1之后才有的,可以看做是水平拆分,分区表需要在建表的需要加上分区参数,用户需要在建表的时候加上分区参数;
分区表底层由多个物理子表组成,但是对于代码来说,分区表是透明的;
SQL中的条件中最好能带上分区条件的列,这样可以定位到少量的分区上,否则就会扫描全部分区。
2.增加缓存
主要的思想就是减少对数据库的访问,缓存可以在整个架构中的很多地方;
比如:数据库本身有就缓存,客户端缓存,数据库访问层对SQL语句的缓存,应用程序内的缓存,第三方缓存(如Redis等);
3.字段设计
单表不要有太多字段;
VARCHAR的长度尽量只分配真正需要的空间;
尽量使用TIMESTAMP而非DATETIME;
避免使用NULL,可以通过设置默认值解决。
4.索引优化
索引不是越多越好,针对性地建立索引,索引会加速查询,但是对新增、修改、删除会造成一定的影响;
值域很少的字段不适合建索引;
尽量不用UNIQUE,不要设置外键,由程序保证;
5.索引优化
尽量使用索引,也要保证不要因为错误的写法导致索引失效;
比如:避免前导模糊查询,避免隐式转换,避免等号左边做函数运算,in中的元素不宜过多等等;
6.NoSQL
有一些场景,可以抛弃MySQL等关系型数据库,拥抱NoSQL;
比如:统计类、日志类、弱结构化的数据;事务要求低的场景。
表拆分
数据量进一步增大的时候,就不得不考虑表拆分的问题了:
1.垂直拆分
垂直拆分的意思就是把一个字段较多的表,拆分成多个字段较少的表;上文中也说过单表的字段不宜过多,如果初期的表结构设计的就很好,就不会有垂直拆分的问题了;一般来说,MySQL单表的字段最好不要超过二三十个。
2.水平拆分
就是我们常说的分库分表了;分表,解决了单表数据过大的问题,但是毕竟还在同一台数据库服务器上,所以IO、CPU、网络方面的压力,并不会得到彻底的缓解,这个可以通过分库来解决。
水平拆分优点很明显,可以利用多台数据库服务器的资源,提高了系统的负载能力;缺点是逻辑会变得复杂,跨节点的数据关联性能差,维护难度大(特别是扩容的时候)。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注;关注我后,可私信发送数字【1】,获取学习资料。
猜你喜欢
- 2025-07-23 MySQL之数据库的设计(mysql数据库设计与应用)
- 2025-07-23 MySQL--索引(mysql索引有哪几种)
- 2025-07-23 系统整容纪:用知识来"武装"自己~认识MySQL的锁与事务
- 2025-07-23 MySQL innodb的B+树到底长什么样,为什么MySQL要这样设计?
- 2025-07-23 软网推荐:超强密码的产生与记忆(网络密码解锁软件)
- 2025-07-23 Go语言数据库编程:GORM 的基本使用
- 2025-07-23 数据库——主键和唯一键的区别(mysql简述主键与唯一约束的区别)
- 2025-07-23 系统性能分析从入门到进阶(系统性能分析怎么写)
- 2025-07-23 从零开始一个完整的全栈项目(2) - 创建数据库表
- 2025-07-23 MySQL数据库之数据库约束,一文带你了解
- 最近发表
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)