目前关系型内存数据库主要有MySQL(使用内存存储引擎)、SQL Server(In-Memory OLTP)、数蚕内存数据库、Oracle 内存数据库。
MySQL:免费产品,内存存储引擎使用较少。
SQL Server:微软的商业化产品,是为了适应大数据等业务产品新添加的存储引擎,微软SQL语句兼容性好,商业化成熟度高。
数蚕内存数据库:数蚕科技针对中小型企业的内存数据库,目前成熟度较弱,c++接口特性良好,SQL特性较弱,只支持基本的SQL语句 *** 作,不支持事务。
Oracle 内存数据库:基于内存计算的关系数据库, 提供了响应时间极 短且吞吐量极高的应用程序。
非关系型内存数据库主要有FastDB、Memcached和Redis等主流内存数据库。结构简单,支持数据结构多以基础数据结构为主,一般应用于缓存等非关键数据存储,其优点是数据查询速度快,对下层编程接口良好。
数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷
1 优化一览图
2 优化
笔者将优化分为了两大类,软优化和硬优化,软优化一般是 *** 作数据库即可,而硬优化则是 *** 作服务器硬件及参数设置
21 软优化
211 查询语句优化
1首先我们可以用EXPLAIN或DESCRIBE(简写:DESC)命令分析一条查询语句的执行信息
2例:
显示:
其中会显示索引和查询数据读取数据条数等信息
212 优化子查询
在MySQL中,尽量使用JOIN来代替子查询因为子查询需要嵌套查询,嵌套查询时会建立一张临时表,临时表的建立和删除都会有较大的系统开销,而连接查询不会创建临时表,因此效率比嵌套子查询高
213 使用索引
索引是提高数据库查询速度最重要的方法之一,关于索引可以参高笔者<MySQL数据库索引>一文,介绍比较详细,此处记录使用索引的三大注意事项:
214 分解表
对于字段较多的表,如果某些字段使用频率较低,此时应当,将其分离出来从而形成新的表,
215 中间表
对于将大量连接查询的表可以创建中间表,从而减少在查询时造成的连接耗时
216 增加冗余字段
类似于创建中间表,增加冗余也是为了减少连接查询
217 分析表,,检查表,优化表
分析表主要是分析表中关键字的分布,检查表主要是检查表中是否存在错误,优化表主要是消除删除或更新造成的表空间浪费
1 分析表: 使用 ANALYZE 关键字,如ANALYZE TABLE user;
2 检查表: 使用 CHECK关键字,如CHECK TABLE user [option]
option 只对MyISAM有效,共五个参数值:
3 优化表:使用OPTIMIZE关键字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;
LOCAL|NO_WRITE_TO_BINLOG都是表示不写入日志,优化表只对VARCHAR,BLOB和TEXT有效,通过OPTIMIZE TABLE语句可以消除文件碎片,在执行过程中会加上只读锁
22 硬优化
221 硬件三件套
1配置多核心和频率高的cpu,多核心可以执行多个线程
2配置大内存,提高内存,即可提高缓存区容量,因此能减少磁盘I/O时间,从而提高响应速度
3配置高速磁盘或合理分布磁盘:高速磁盘提高I/O,分布磁盘能提高并行 *** 作的能力
222 优化数据库参数
优化数据库参数可以提高资源利用率,从而提高MySQL服务器性能MySQL服务的配置参数都在mycnf或myini,下面列出性能影响较大的几个参数
223 分库分表
因为数据库压力过大,首先一个问题就是高峰期系统性能可能会降低,因为数据库负载过高对性能会有影响。另外一个,压力过大把你的数据库给搞挂了怎么办?所以此时你必须得对系统做分库分表 + 读写分离,也就是把一个库拆分为多个库,部署在多个数据库服务上,这时作为主库承载写入请求。然后每个主库都挂载至少一个从库,由从库来承载读请求。
224 缓存集群
如果用户量越来越大,此时你可以不停的加机器,比如说系统层面不停加机器,就可以承载更高的并发请求。然后数据库层面如果写入并发越来越高,就扩容加数据库服务器,通过分库分表是可以支持扩容机器的,如果数据库层面的读并发越来越高,就扩容加更多的从库。但是这里有一个很大的问题:数据库其实本身不是用来承载高并发请求的,所以通常来说,数据库单机每秒承载的并发就在几千的数量级,而且数据库使用的机器都是比较高配置,比较昂贵的机器,成本很高。如果你就是简单的不停的加机器,其实是不对的。所以在高并发架构里通常都有缓存这个环节,缓存系统的设计就是为了承载高并发而生。所以单机承载的并发量都在每秒几万,甚至每秒数十万,对高并发的承载能力比数据库系统要高出一到两个数量级。所以你完全可以根据系统的业务特性,对那种写少读多的请求,引入缓存集群。具体来说,就是在写数据库的时候同时写一份数据到缓存集群里,然后用缓存集群来承载大部分的读请求。这样的话,通过缓存集群,就可以用更少的机器资源承载更高的并发。
一个完整而复杂的高并发系统架构中,一定会包含:各种复杂的自研基础架构系统。各种精妙的架构设计因此一篇小文顶多具有抛砖引玉的效果,但是数据库优化的思想差不多就这些了
首先要确定你的目标,所谓千万级是每秒千万次查询还是千万条记录的数据库,前者是一个极其复杂的,这个不是光告mysql能解决的,我想不是前者,而后者却是很简单的一件事,前提是定义高效,定义两个指标:
1,每秒查询的次数是多少
2,每次查询时长
确定好以后再考虑以下几个因素的优化
1,存储的类型,SSD比普通磁盘的随机读写能力可以提高不少,一般2到3个数量级,还要看索引和数据块的大小,比较复杂
2,先择RAID类型,如果选raid0和raid10可以提升近似1倍的速度
3,使用高带宽的网速,可以减少网络传输延迟,用10g的光纤比1g的电缆理论上可以提升1个数量级的吞吐量,尤其对大数据据量的结果集特别有效
4,合理的索引,带条件的检索字段加上索引
5,用大宽表,尽可能减少多表关联查询,用空间换时间吧
6,_用主从的集群,基本上查询的并发量和服务器的数量成正比的
7,使用缓存,如memcached,尤其对静态数据提升尤其明显
8,合理选择数据库字段的类型,用定长字字,不要用变长的,如定长的int,char,decimal类型,别用varchar,text等
9,给数据库配置更大的内存
10,检查下瓶颈在不在CPU,如果查询复杂,换个更高配置的服务器
总的原刚就是,尽可能用内存替代碰盘提升IO速度,提高网络和CPU的配置以减少查询时间;尽可能提升网络速度,内存和主机的数量以提高并发
我们先探讨非高并发量的实现。
对于查询频次较高的字段,加上索引。
加索引注意事项:
1对那些字符内容较长的最好不要加索引
2按照官方文档,单表加的索引不要超过16个,索引的长度不要超过256个字节。
随意加索引,会给数据维护增加负担
其实,可以引入分区。
分区注意事项:
1常见的分区类型有range,list,hash,key等。用的比较多的就是range分区。
2对于初始建立索引的时候,我们往往会忽视一个前提条件,导致添加失败报错。
这里的前提是,如果表是有主键的,分区的键和主键不是同一个,那么分区的键也必须是主键。
引入分区后,数据写入时,数据库会自动判断写入哪个分区
对于并发量较高的,我们除了做上面的 *** 作外,就要考虑分库分表或者采用一主多从的方式。
未来我相信这类问题需要采用NewSQl这类数据库来解决,如TiDb等,此时,我们将不必考虑数据分区的问题,而且可以做到数据水平无限扩展,和热点数据的动态分布。
以上就是关于内存数据库主流的有哪些,并给出各自特点!全部的内容,包括:内存数据库主流的有哪些,并给出各自特点!、超详细MySQL数据库优化、如何设计一个能够高效查询的千万级MySQL数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)