数据库的使用你可能忽略了这些 (续)
前言
之前写过一篇文章《数据库的使用你可能忽略了这些》,主要是从一些大家使用使用时容易忽略的地方,如:字段长度、表设计等来说明,这篇文章同样也是这样的主题,只是从另外的几个方面来说说数据库使用中,容易忽略,导致入坑的地方。
合理预估数据量
在数据库进行表设计的时候,就应该评估可能产生的数据量,数据量会对整个开发和代码的健壮性有很大的影响。开发一个数据量万级别、十万级别、百万级别、千万以上级别数量的应用,在开发思路、技术选型、架构都能都要很大的差别。
基本上的我的原则是:
- 万级别的数据库,可以随意一点,SQL编写有好的习惯;
- 十万级别,注意索引,注意联表性能;
- 百万级别,尽量减少联表,尽量不要做汇总查询,如查总数 ;
- 千万以上级别,除缓存之外,使用分表分库 ;
很多系统因为在设计表的时候,没有很好的预估的后期系统的发展,导致上线不久就出现无法支撑的情况,代码上太多的联表查询,不在乎基础的SQL性能,导致数据库的瓶颈很快就显现出来,不得不重构系统。设计数据库的时候,一定是基于业务进行设计的,对业务的发展有一定的预估,看得长远一点。
合理预估并发访问量
数据库有天然的瓶颈,就是并发量。我们一般会通过缓存来减少数据库的并发连接,以及对数据库的操作,数据库的并发,不是只有大型平台才会遇到,很多中小平台其实也会面临这样的问题,例如:
循环进行数据库的操作
这个问题,上一篇文章我也提到过,不要在循环里进行数据库的操作,这个会直接导致数据库连接数暴增,影响非常严重。虽然是个比较低级的问题,但是出现的概率其实是非常高的,在我身边看到很多很多这种案例了,这种问题,就是需要程序员自己本身避免这些问题,当然,也可以通过一些手段去监控,找到这些问题,只是会比较麻烦一点。
业务本身的高频次数据请求
其实有些业务,即使是中小型的平台,也会有高并发请求数据库的情况,常见的例子如:日志。例如,我们需要抓取到所有人的操作日志,或者所有模块的加载时间,并且持久化保存。如果,当初选型通过Mysql去记录这些数据,那么就很容易遇到高并发的问题。这种就是属于选型的错误了。
数据库对高并发的处理一直是短板,所以应该尽量避免高并发的数据库操作,查询通过缓存处理,增删改这可以通过MQ或者Kafka这样的工具异步进行处理,如果对数据库的结构化要求不高,则可以用hbase或者hive进行数据库的保存。
数据库线程池的合理使用
现在数据库的操作都是使用线程池的,线程池主要是用来控制数据库的连接数,其实连接池是不属于数据库范畴,但是,一般我们使用和数据库结合非常紧密,所以在这里一并说明。
一般线程池都会有这样的几个参数:
参数 | 说明 |
---|---|
最小连接数 | 不管是否有数据库的操作,这几个连接都会一直存在, |
最大连接数 | 允许的最大的连接数,如果超过了这个数据,则无法申请连接,只能等待,或者异常 |
回收时间 | 多长时间会对所有的连接进行一次断开,然后重新连接。 |
释放时间 | 多长时间没有进行操作的连接,会释放 |
基本所有的连接池都会有这几个参数,可能不同的连接池参数名不同,但是作用是一样的。 这里我们重点说一下最大连接数,这个是很容易忽略的一个设置。
很多人设置最大连接数的时候,喜欢设置的很大,例如设置为5000,但是一般mysql的数据库一个实例连接默认才1000,连接数超过这个了数据库也无法处理,设置的再大其实是没用的。
服务器数量 * 最大连接数 < 数据库最大连接数
而且,这还是在一个实例,一个数据库的情况下,至于多个数据库:
我建议
服务器数量 * 最大连接数 * 数据库数量 < 数据库最大连接数
如果单个数据库占用了太多的数据库连接,会影响到其他数据库,导致其他数据库也无法使用。
当然,这个值大家可以根据业务去进行合理的估算,高频的业务分配多一点,低频的业务分配少一点。不要盲目的一味设置连接池的最大值。
总结
如今,虽然各种各样的存储方式出现,但是关系数据库一直是我们系统的最重要的组成部分,尽量不要过早暴露数据库应对并发的短板,设计数据库和操作数据库在我们的开发中应该是一件很神圣的事情,认证对待关系的数据库的每一个操作才是明智之举。
扩展阅读:
数据库的使用你可能忽略了这些
学会数据库读写分离、分表分库——用Mycat,这一篇就够了!
欢迎大家关注我的公众号交流、学习、第一时间获取最新的文章。
微信号:itmifen
转载于:https://juejin.im/post/5b8369236fb9a019ec69ff75
数据库的使用你可能忽略了这些 (续)相关推荐
- 数据库复习题选择题+判断题+填空题(考试续命必备
数据库复习题选择题+判断题+填空题(考试续命必备 一些选择题 1.从计算机数据管理的角度看,信息就是数据,数据就是信息.(B ) A.对 B.错 (描述事物的符号记录称为数据 数据库的数据项之间无联系 ...
- dbm数据库源代码分析(4):头文件部分(续)
(7)proto.h:dbm例程的所有函数原型声明.包括内部接口和gdbm的用户接口.ndbm和dbm的兼容性实现也要用到这里的各个函数.这些函数的功能在具体的源代码解剖时会有详细说明.注意一些老式的 ...
- android专题-数据库Room
android专题-数据库Room Room介绍 room是Google官方推荐的ORM数据库框架,抽象出sqlite访问的数据库. 包含三大组件: Entity 定义 表结构,每个entity类对一 ...
- 软件设计是怎样炼成的(6)——打造系统的底蕴(数据库设计)(上篇)
摘要: 数据库是系统的根基,如果需求变更导致你要经常修改数据库的字段,甚至需要修改表及表关系,相信多折腾几次谁都受不了!因为数据库结构的变化,不仅仅是数据库本身的变更,实体类.数据操作层.逻辑层和表现 ...
- Redis实现之数据库(三)
过期键删除策略 在Redis实现之数据库(二)一小节中,我们知道了数据库键的过期时间都保存在过期字典中,又知道了如果根据过期时间去判断一个键是否过期,现在剩下的问题是:如果一个键过期了,那么它什么时候 ...
- 6、mysqldump备份数据库(附带实例)
数据库的主要作用就是对数据进行保存和维护,所以备份数据是数据库管理中最常用的操作. 为了防止数据库意外崩溃或硬件损伤而导致的数据丢失,数据库系统提供了备份和恢复策略. 保证数据安全的最重要的一个措施就 ...
- 如何创建一个MVC模式的Joomla组件教程(九) 使用数据库下
你可能看到了表的前缀非常奇怪.Joomla将替换这个前缀,用安装时候指定的内容.对于通常的安装,这个表名将是jos_hello,这样可以多个安装使用一个数据库,并且能够避免表名冲突. 表中有两个字段, ...
- mysql数据库表名大小写敏感_Mysql数据库名和表名的大小写敏感性问题
导读:一直以来,Mysql数据库名和表名的大小写都是个敏感的问题,困扰着Mysql数据库管理员.在 MySQL 中,数据库和表对应于那些目录下的目录和文件.因而,操作系统的敏感性决定数据库和表命名的大 ...
- 企业级数据库备份方案完全攻略
在当今的发达的信息领域,体现价值的珍贵性的不是计算机软件,也不是计算机硬件,而是计算机内的各种宝贵数据.但是各种因素像人为错误,硬盘损坏,电脑病毒或者各种停电,自然灾害都有可能使得数据的使用变得不牢靠 ...
最新文章
- 视频写操作,通道分离与合并
- winxp登陆后自动注销
- 在SpringBoot中使用redis实现分布式锁
- 杀软厂商开源--从此走向平台化?
- Python助力期末
- Windows批处理命令学习三
- TabActivity中子Activity相互跳转,及某个Tab需弹出窗的解决方案
- 笔记本连接显示器后没有声音_电脑用HDMI外界显示器后,没有声音
- CSS详解(二)——CSS连接方式、CSS分裂与CSS分裂检测
- python如何运用ols_python - 如何在python中使用OLSResults.f_test与实验组进行测试 - SO中文参考 - www.soinside.com...
- 关于未知的USB设备(设备描述符请求失败)的解决方法
- Opengl glm配置出错
- mysql打字竖线_如何打出竖线,教你怎样键盘打出竖线?
- it is dying gasp packet 说明
- 程序员面试常见的10个问题,非常实用的面试技巧,收藏一下
- Leetcode 32 最长合法括号子序列
- Youtube 预装到系统后运行报错
- App inventor 写的垃圾分类小助手(一)
- Gym 103117 Problem - Spicy Restaurant
- pytorch RNN实现分类
热门文章
- boost::hana::lift用法的测试程序
- boost::property_map用法的测试程序
- boost::geometry::line_interpolate用法的测试程序
- GDCM:gdcm::XMLPrivateDictReader的测试程序
- GDCM:DICOM文件转储图像标题信息的测试程序
- GDCM:gdcm::Object的测试程序
- ITK:拉普拉斯递归高斯图像滤波器
- DCMTK:OFerror_code的测试程序
- Qt Creator从Maya导出3D资产
- OpenGL indexedCube索引多维数据集的实例