数据库学习 - 大规模并发优化学习笔记

大规模并发

当网站有很多人访问的时候,并发量增大,这个时候我们所设计的网站就会遇到挑战。很多本来是没有问题的设计,这个时候可能就会暴露出问题了。

就像宏观物理定理不适合微观一样。
下面是一些优化的建议方法。

优化服务器配置

这个是在硬件上提升服务器,因为任何软件上的优化都是有瓶颈和极限的,所以提高服务器数量和配置是比较简单也很有效的解决办法。假如性能不是很好,那么就保证数量。最好再有一台作为冗余的来保障服务器的故障,提高鲁棒性。

使用负载均衡

这个词在现在很火,因为很多网站都在收集大量的数据,所以数据的并发量也很好。负载均衡是解决集中并发访问的核心技术,也是一种比较有效的方法。

主要设备就是负载均衡服务器,安装负载均衡软件,把大规模用户产生的高并发均衡分流到各个服务器上。

数据库结构设计

这部分内容也很多,一般都是对数据库结构,数据库语句进行优化。下面我会详细写一下数据库的优化方法。

中间件优化

这部分我接触不多,当时也没好好学。
如Apache, IIS, Tomact, WebLogin 这些都是中间件。

数据缓存使用

缓存是把数据库的常用数据用Cache缓存起来,减少服务器重新请求的压力。提高速度。

数据库高并发

数据库高并发的情况,要先找一下瓶颈所在。CPU还是IO还是网络。
所以我们可以有下面的一些解决方案:

  • 提高网络带宽
  • 高性能的数据库服务器和Web服务器
  • 优化分页存取数据
  • 稳定高性能的数据库访问层
  • 优化数据库缓存,多用内存缓存的方式来处理数据
  • 数据库的索引优化
  • 对事务处理的设计要严谨
  • 记录完成的操作日志,容易定位错误。
  • 增加负载均衡服务器
  • 优化前端代码
  • 考虑用压缩方式传输HTML和Javascript代码。

数据库并发策略

  1. 最后结果生效。 让用户最后修改的结果生效,减少操作次数。
  2. 开放式并发。 当冲突只是偶尔发生,出现冲突的时候告知用户。
  3. 保守式并发。冲突经常发生的情况,又不能随便让冲突发生,重新操作,那么就在用户对表的记录编辑的时候加锁,不让其他人来编辑。
  4. 版本号方法。 当读取记录的时候,设立日期时间戳或版本号,当更新记录的时候,进行匹配。(为了确保准确性应该在表上设置触发器)。

数据库设计建议

这里写下我平时学的还有书上的一些知识,关于数据库的一些设计简易。
1. 多表设计。
2. 不要用自增属性作为主键与子表进行关联,不便于系统迁移和恢复。

表设计的具体问题

  1. 数据行的长度不要超过8020个字节,如果超过的话,物理页就会占用两行,从而造成存储碎片。降低查询效率。
  2. 能够用数字的字段,尽量不用字符类型,因为字符串匹配更耗时。

查询优化

  1. 实现功能的基础上减少数据库访问次数。
  2. 通过参数尽量减少访问行数,减轻网络负担。
  3. 查询SQL的时候,尽量把索引放在首列。
  4. 算法结构尽量简单。
  5. 见谅不要用select * from table. 不要用 * 。
  6. 多使用MySQL查询优化器

放弃索引会进行全表扫描的操作

  • 对NULL值进行判断。( 默认值为0会改善 )
  • 用!= 或者 <> 操作符
  • 用or链接

注意事项

  1. 慎用in 和 not in
  2. 避免在索引字符中使用非打头字幕搜索。(无法用索引加速)
  3. 可以用强制查询优化器来使用某个索引加速
  4. 尽量避免在where子句中对字段使用函数操作。
  5. 不要在where子句的=左边进行表达式操作。
  6. 可以的话用exist.
  7. 尽量避免大的实务操作。可以提高并发能力。
  8. 充分利用连接条件。
  9. 利用视图加速查询
  10. 利用Distinct 取代 group by
  11. union all取代 union

算法优化

尽量避免使用游标,基于集的方法可能更有效。
建立高效的索引。

大型数据库一般有两种索引:簇索引和非簇索引。

没有簇索引的表是按照堆结构存储的。所数据添加在表的尾部。

一个表只有一个簇索引,数据在物理上是按照簇索引的顺序存储的(B树结构)。提高查询速度。会降低插入更新删除操作的性能。

大致如上。学习笔记。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。