高并发,大容量,高性能数据库设计优化
1.数据存储
a.集中式----》分布式
复制m/s、切分
a.1切分
垂直切分(按功能模块)
难点:跨域的表关联---》应用程序
事务----------》分布式的事务(单独数据源的小事务,然后通过程序控制)
某些表访问剧增-----》读写分离
读写分离(异构数据源之间的读写分离)
相同数据源,只需要master/slave
难点:异构数据源之间的全量复制问题
异构数据源之间的增量同步问题(解析日志)
水平切分(按记录切分----》找规则)
a.2 数据切分及整合的中间件
了解其它中间件(服务框架中间件、消息中间件)
mysqlProxy---->只针对mysql LUA脚本
amoeba ----->框架
----->amoeba for mysql
----->amoeba for Aladin
corba ---->文档较少,可以关注 14年会有新版本发布。
b.引入NOSQL---》多种存储方案(不同类型的数据,存储在不同的数据源)
nosql分类
key/value 内存数据库------->Memcached、redis
bson 文档数据库------->Mongodb
db----database
collections----table
document----record
Column-Family 列数据库----->Cassandra/hbase
---------------------------前三种是聚合模型
关系 图数据库-------> neo4j
nosql --->CAP理论
互联网的应用AP+BASE原则
c.统一数据服务平台(让数据透明)-----》如何设计
c.1 对外提供的统一的查询API,持久API
c.2 能够支持异构数据源(关系、非关系)
c.3数据源改造不需要大面积重构数据平台
c.4性能优化(延迟加载、按需加载、热点缓存、异步并行加载)
热点缓存:(热点规则、key规则、过期规则)
异步并行加载
d.数据同步
d.1 相同的多数据源直接使用master/slave机制(数据量不太大)
d.2 数据量特别大or异构数据源
TimeTunnel2(tailFile组件、saveFile组件,dfswrite组件)
tailFile组件抓取日志增量、爬虫增量数据
saveFile 保存到磁盘
dfswrite写入hdfs
DataX
异构数据源之间的导入导出工作
框架+插件的模式(读插件、写插件)
Dbsync
e.分布式缓存Memcached(key/value)
e.1特点
内存存储(对内存要求高,对CPU要求低,选择对内存要求低对cpu要求高的应用部署在一起,节约硬件资源)
集中式的缓存(每台实例都是独立的,不支持通讯,单点问题支持横向扩展,把客户端包含在一起是分布式的)
分布式扩展(支持动态添加机器)
Socket通讯(只要支持socket得语言都可以支持其客户端。以java为例,就需要注意序列化的问题、序列化优化的问题)
特殊的内存分配机制(每个对象最大只能1m)
缓存机制简单(就两次hash,一次定位实例,一次放入HashMap)
e.2 安装启动
启动参数:-d,-m内存大小,-n、-f将来对调优很重要
e.3Memcached基本命令
set/add/replace/cas/get/gets/incr/decr/delete/stats
e.4 客户端操作
java客户端的操作优化:
e.4.1提炼接口
e.4.2用配置文件的方式代替硬编码初始化客户端
e.4.3单点问题---》备份
Memcachedb-->新浪BerkeleyDB
淘宝实现的cluster机制---》通过java语言实现的
e.4.4本地缓存(OSCache/EhCache)结合Memcached
e.4.5Memcached提供的java源码中都是用java5之前的
线程处理技术,会影响性能。用锁对象替换synchronized,用java5提供的线程安全的集合类提供性能
e.4.6java中客户端读数据时,是单字节读取的
e.5集群操作
一致性hash运算 c(libMemcached已经实现了该操作)
本身服务器端是不直接支持集群的。
Memcached很多时候都用在了数据库前端缓存
MSM(Memcached session manager)
网站架构中的缓存
页面缓存(OSCache,EhCache)
页面静态化(io/xml+xslt)
页面局部缓存(OSCache/EhCache/Etag)-->用的都是标签
浏览器缓存(header操作/浏览器插件/html5)
反响代理服务器缓存(nginx+squid)
webServer本身的缓存
e.6 redis
支持更丰富的数据类型 key/value(二进制)
支持持久化(单点问题就解决了)
master/slave(master宕机之后slave自动升级)
e.6.1string/ list/hashes(hashmap)/set/sorted-set
e.6.2rdb方式 aof的方式
e.6.3master/slave机制
当slave断开,从连之后,没有增量操作,会删除
slave之前所有的数据然后,从master从新全部获取
解决:增量读取
master宕机之后,slave自动升级(切换达到秒级实现redis自动切换功能达不到这个效率)
解决:keepalived
e.6.4java客户端jedis(集群的问题)
e.6.5redis优化
2.数据库的查询优化
硬件规划:tpc(非盈利性组织,测试服务器性能,tpcc,tpmc科学数据)
mysql查询优化:
a.优化器模块
a.1计算出最优的执行计划、
a.2mysql新技术绕过它---handlersocket(把mysql改造成了nosql) 批量处理、长连接性能极高、所有数据都适合放入内存
b.优化原则
找高并发的query语句
反复查看执行计划和性能瓶颈分析
用小结果集驱动大结果集---》和join算法有关
尽可能在索引中完成排序
只返回自己需要的列
只用最有效的条件
尽量减少join和子查询
c.索引
利:排序的时候减低cpu的使用,查询的时候降低了IO
弊 : 如果列中建立索引,每次修改这列数据,都会更新索引
什么时候用:频繁作为查询条件,且修改较少的字段
索引失效:
在查询语句中索引字段上做任何的计算、函数、类型转换都会使得索引失效,变成全表扫描
在索引列上做模糊查询以通配符开头索引失效全表扫表
在索引列上使用!=,索引列失效
非等值连接 hash索引失效
d.join优化
mysql join效率本身很差 join一定是很少用的(切分、适当的冗余)
d.1小结果集驱动大结果集
d.2尽量被驱动表通过索引查询(注意索引失效的问题)
d.3 join_buffer_size的配置,尽量增大
e. order by优化
e.1尽量在索引列上完成排序(注意索引失效问题)
e.2如果不能再索引列上要求增大max_length_for_sort_data
参数的设置,比返回的最长的列要大即可。
mysql内部有两种排序算法(老、新)
e.3只返回自己需要的列
e.4增大sort_buffer_size参数的设置
f.group by 优化
先排序再分组
f.1同上e
f.2能再where中限定的不要去having限定(如果可以的话)
g:DISTINCT
先排序再分组,然后每组取一条(同f)
mysql Server优化:
a.安装 ---》使用二进制、源码安装(gcc编译器)
icc(intel c comiler)编译器是新的技术,提高了源码中计算性能,使得查询性能默认可以提高30%左右(泛化的数字)
b.淘宝80%的服务器安装的percona数据库
percona公司---》产品persona(对mysql源码进行了修改)
IO性能处理、内存处理、并发处理等方面都做了优化,并
提供了丰富的性能检测工具,percona必须源码安装,提供
了很多插件的接口,可以加入新技术。如flashCache(把mysql
的一级缓存改造成了二级缓存)
c.Mysql query Cache
优点:
缺点:计算有消耗、存的结果集会重复存
mysql 存储引擎
MyISAM
1.不支持事务、表关系
2.操作的是表锁、并发太多服务会宕掉
3.缓存的时候,只缓存索引不缓存真实的数据
,真实的数据时通过OS级别的缓存,所以对内存要求低。
INNODB
1.支持事务和关系
2.操作的时候是行锁,支持并发操作
3.缓存的时候既要缓存索引也要缓存真实数据,对内存要求
高,有一个非常关键的参数设置,直接决定了数据库的性能
innodb_buffer_pool_size除掉独占内存和适当冗余全部 给它。
xtrdb
percona出品的xtrdb存储引擎完全可以替代innodb
并且在并发和内存使用上有更多的提高
mysql新技术:
handlersocket(淘宝内部客户端操作是封装成了中间件)
percona/xtrdb
flashCache
高性能的编译器intel c compile
了解高性能的分布式文件系统 ext3/ext4
Oracle查询优化
1.oracle共享池原理(必须要一模一样简单的sql语句大小写、空格 、参数名称等要完全一模一样)
2.不要让oracle做的太多
2.1避免复杂的join和子查询
2.2不要使用* (查询数据字典、列出所有列、用别名可以提高效率)
2.3用EXISTS替换DISTINCT
DISTINCT 排序分组取单一
2.4用UNION-ALL 替换UNION ( if possible)
UNION会先做union-all然后排序
3.给优化器更明确的命令(索引使用--->避免索引失效)
3.1如果有唯一性索引和非唯一性索引oracle只
识别唯一索引
3.2如果是复合索引,复合索引的第一列必须出现才会使用索引
否则会做全表扫描
3.3任何在索引列上的操作(函数、计算、类型转换等)
都会使得索引失效,而进行全表扫描
3.4模糊查询时避免在索引列上使用前置通配符,否则索引失效
,进行全表扫描
3.5不要索引列上使用NOT操作,is null ,is not null
4.细节上的影响
4.1多表查询的时候把条件限定后结果集最少的放在条件的最右边
4.2尽量不要在列上做任何计算、函数、转换等,防止索引失效
4.3order by放在索引列上,并禁止使用表达式
4.4用where子句替换having字句(可能的话)
4.5用NOT EXISTS 替代NOT IN
4.6尽量少使用等值连接替换非等值连接
3.数据库的设计优化
3.1第一范式、二范式... ...五范式(解决数据的冗余)
3.2范式和非范式集合使用(有的时候需要适当冗余数据减少join)
3.3大字段垂直拆分、列的访问存在差异(有的列特别频繁,有的列很少访问)也要做垂直拆分
3.4大表水平拆分
3.5尽量使用小的空间、尽量使用运算快的数据类型(尽量能用数字的用数字表示)
4.数据集成(统一数据服务平台)
a.统一API,并且能够适应数据源的改造(面向对象的操作)
关系数据库---->hibernate
非关系型数据库---->spring-data for Mongodb
spring-data for Mongodb for Reids
b.对象的属性和数据中的类型不一定直接匹配
对象到数据源之间的类型映射转换
数据源到对象之间的类型映射转换
c.性能优化
c.1热点缓存
热点可配置
二级缓存(一级缓存索引、二级缓存对象,过滤重复)
过期(相对过期、绝对过期、事件过期--->消息中间件)
c.2 异步并行加载(线程的异步设计)
代理思想(代理模式实现)
并行的执行容器(线程的操作)
5.业务层----》分布式架构---》soa
6.前端
js/css合并
js动态加载(labjs/require js/control js)
mvc
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。