系统架构知识梳理
1.访问数据库查询数据2种方式。 全表扫描和索引。
1)尽量使用索引,避免全表扫描。 应对where,orderby建立索引;where null ,《》!=,like,between in,in not in 不要使用最好
2)未必使用索引都比全表扫描快。 比如:当数据量很小的情况,全表扫描的速度可能会比使用索引快。
3)索引 优点:加快数据查询 缺点:写入数据库容易造成页碎片,插入,删除数据会重新生成索引,还得移动附近的数据,容易造成部分存储空着用不到
索引的结构是 B树(左右节点数目近乎相同),即二叉树;
有根节点,非页节点(引导根节点到页节点上),页节点(包含索引数据的页)
2.视图的好处
假如需要查询下面的数据,sql语句如下
select A.id,B.no,B.no2 from A,B where A.id=B.id 首先,编码人员需要知道数据库表的关联以及相关字段id。
如果我们有个view 视图 如下。
create view v_example as
select A.id,B.no,B.no2 from A,B where A.id=B.id
那么我们查询的语句应为: select * from v_example (告诉数据库把查询v_example视图的获得的数据直接给我)
好处:1)不需要熟悉表关联关系,可以直接获取数据 2)对闲杂人员,隐藏表真实内部结构,增强安全性。
3.传统web架构,大体上简单架构
web负载均衡,服务器集群,主从数据库(读写分离),缓存技术,队列,分布式存储。
1)web负载均衡cdn
分担节点的压力,分担到其他节点上面去。尤其大并发量,可以将并发了分担到不同节点上。
?web服务器如何确保 各台程序都相同
2)服务器集群
将一个复杂计算分配到几个节点上面去,然后汇总各个节点的结果。
3)主从数据库(读写分离) Master和Stave数据库,解决写数据库造成数据库卡。
数据库作用就是被读写;当写数据的时候会对数据进行行锁,页锁,段锁,会影响其他数据的查询。
经过调查 读:写 10:1。
那么分主数据库和从数据库。
主数据库用于增删查数据写入和最新数据的读取(从数据库是通过订阅主数据库数据进行数据库同步的,会有不等的延时,可以设置时间,延时几分钟,几小时等)。
从数据库用于 读改动很小的数据,比如:60天之前的订单信息(几乎不会变动)。
例:可以将订单号格式设置为 年月日小时分钟秒随机数. 20110523180012sdfdfjk
根据订单号,确定是否为60天之前的订单,如果是 设置 connectring=从数据库的信息,如果不是 connectring=主数据库的信息。
例:豆瓣读书: 图书信息,标签信息,评论信息,喜欢这本书的读者列表
图书信息需要最新的,所以可以从主数据库读取
标签信息不需要很新不需要及时,从从数据库读取
评论信息需要即使,主数据库读取
喜欢这本书的读者列表,从从数据库读取。
4)缓存技术
命中率(命中次数/总次数)
一级缓存常常是单独服务器,二级缓存指的是web服务器的缓存
页面html缓存;页面局部元素缓存;复杂查询结果集缓存;耗时查询,如产品列表页面;热点查询。
5)分布式存储
6)队列
sql队列:发送email,发送短信等。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
数据库优化:
垂直划分: 用户的不同信息最好存不同表或者数据库中
水平划分: 同一表中数据 存放到2个数据库中,结构也相同。 方法: 如基数id放在A数据库,偶数id放在b数据库; %10也行; hash算法也行。
数据库备份,当出现问题立马切换。切换策略呢? web服务器,数据库服务器,备份服务器(存放数据库配置,web配置,缓存配置。当遇到问题通过切换策略替代有问题的服务器。直接换
个ip就可以了。)