学编程,来源栈;先学习,再交钱
当前系列: SQL 修改讲义

关系型(SQL)数据库的特点

特点
实现
适用于
不适用于
表结构
建表时确定列
规范格式数据(如:报表)
异性(非规范结构)数据,扩展性不够,比如:爱好
数据完整性
范式、约束、事务……
高标准要求正确性
无需严格检查数据正确性
高可查询性
索引、丰富的SQL语句
读大于写
写大于读

典型场景:汽车监控系统


NoSQL运动

大致经历一下三个阶段:

  1. 关系型数据库一统江湖:关系型数据库=数据库
  2. No Sql:不再需要SQL 。背景:互联网尤其是Web2.0兴起,海量(低价值)数据生成,数据完整性要求降低,及时性要求增加。
  3. Not Only Sql:不只是使用SQL,大家相互配合。背景:NoSQL在实际开发中遭遇重大挫折……

:工程中的“中庸”,不追求纯粹……

目前NoSQL数据库最广泛的用法:作为“缓存(复习:人人都是程序员)层”使用。


Memcached

特色关键字

  • Free & open source:免费开源
  • distributed:分布式部署,通常是部署在Linux集群上
  • memory object caching:内存对象数据库,数据存放在内存中,所以读写都非常快
  • key/value:以“键值对”形式存储

安装/启动

Windows上演示,需要下载windows安装包

  • 下载,解压,直接运行其中的.exe文件 (最新版本不用考虑老版的“服务”之类的……)
  • 测试成功启动:另外一个cmd中(是memcached自己的黑窗口)telnet 127.0.0.1 11211(默认端口)
    注意telnet客户端需要开启

命令格式都一样:

set {key} {flags} {exptime} {bytes} [noreply]

set yz 1 30 5  //存储 键yz 标记1 30秒,占用5个字节
nosql //键yz对应的值为nosql
  • set:关键字,存放
  • key:键值对中“键”的名称
  • flags:可以理解为“额外标注”,通常用于客户端表示数据类型,因为memcached中只存储string类型。比如:
    1. 我存一个整数986,不行,memcached只会将其存储为字符串"986";
    2. 所以,我要在存放的时候标明它是一个整数(比如用 0 表示整数类型)
    3. 最后,我从memcached中取得的是:字符串"986"和一个表示整数类型的flag 0
  • exptime:过期时间,单位秒
  • bytes:存储数据的(字符串)长度,单位字节。必须精确!
  • [noreply]:可选,服务器是否给予回复

其他的命名语法格式和set相同,只是命令关键字不一样:

  • add:如果已有相同键值(key)的缓存,不以存储,返回NOT_STORED (set会予以覆盖)
  • replace:如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED
  • append:向后追加
  • prepend:向前追加


get

删除

delete

stats命令

可以查看memcached的状态,最常用的几个指标:

  • cmd_get:get命令请求次数
  • cmd_set:set命令请求次数
  • get_hits:get命令命中次数
  • get_misses:get命令未命中次数
  • bytes:当前存储占用的字节数

stats后面还可以再跟

  • items:
  • slabs:内存块使用情况
  • sizes,分别查看

小技巧:中文输入法


redis

Redis 官方不建议在 windows 下使用 Redis,所以官网没有 windows 版本可以下载。

和memcached非常类似,通常配合在Java框架中用于做分布式缓存层。

暂略。


性能提升

复习:性能优化

其实从严格意义上来讲,开发人员对数据库的性能优化是无能为力的。

因为他们唯一的手段:写出更好的SQL语句,由于执行计划的存在,很多时候也是不可控的。

包括建立索引、设置事务隔离级别,这些手段严格来说,都是DBA的工作(或权限)。

但面试的时候,开发人员也常常被问起“数据库优化”的问题,所以

堆硬件

是解决性能问题性价比最高的手段。

但是,怎么堆?

水平 vs 垂直 

水平扩展:增加服务器的数量

垂直扩展:增加服务器的质量

但不要因为现在普遍采用的是水平扩展的方式,就认为没有垂直升级的必要。很多时候,垂直升级还是最优解,一般是要垂直升级升不动(性价比低)了,才考虑水平升级。

@想一想@:为什么?方便呀,^_^

读写分离

读一台服务器,写一台服务器。

读服务器自动的向写服务器更新。(实现技术:主从备份

主要是解决很多应用“读远大于写”的问题,不让读/写互相拖累。

集群

多台服务器一起工作,但对外表现为像一台服务器一样(对外透明)。

如果说读写分离对客户透明,也可以认为他们就是一种集群。

但一般认为集群是通过“负载均衡”进行任务分配的,且任务不区分读写。

分布式

当我们着重强调群君和分布式区别的时候,可以这样理解:

集群只强调多台服务器对外透明,很多时候每一台服务器上(节点)的数据是一致的,任何一个节点宕掉都只影响性能不影响可用性(集群的高可用性)

分布式强调分散的部署,很可能不同的服务器部署不同的内容,完成某一项工作有可能需要多个节点配合才能完成,一个节点宕掉可能导致整个工作无法完成(@想一想@:既然如此,为什么还要分布式?单个节点的容量到达上限,图片的分布式存储)



为了解决分布式的问题,可以在分布式的节点上布置集群。

调优

可以认为是DBA的日常工作:在资源恒定的情况下,让数据库有更好的性能表现(performance)。

监控和日志

是性能调优的基础。DBA通常需要获得一些关键的数据:

  1. 服务器资源使用情况:CPU/内存/IO……,有没有明显的不平衡,比如CPU占比过高而内存占用很低
  2. 连接:最大连接数/有无拒绝/长连接……
  3. 索引:使用占比/效率
  4. 缓冲/缓存:有无溢出/空闲,命中率如何
  5. 具体的SQL语句运行情况:慢查询/死锁/长期等待
  6. 数据的组织结构:碎片化程度
  7. ……

然后配合性能优化方法论,找到瓶颈,设计方案,不断测量。

分库分表

纵向拆分,比如:

  • 把近n年的数据放一个库/表,因为经常被使用的就是它
  • 其他的放一个备份表,大部分时间都不会被使用,就是一个“包袱”

横向拆分,比如:文章表的标题/正文/作者/发布时间基本上是恒定的,但赞/踩经常更新,当他们在一张表的时候,赞/踩的更新(假设)会加行锁,就会影响到标题/正文等的读。所以我们可以

  • 标题/正文/作者/发布时间一张表,
  • 赞/踩独立成一张表

但这样的操作,必然影响到业务逻辑的正常实现,只能是(类似于故意违反范式引入冗余的)非常规手段。


作业

尽可能多的写出“查找每个用户关键字最多的求助” 的SQL语句,利用执行计划,找出效率最高的一个。

学习笔记
源栈学历
键盘敲烂,月薪过万作业不做,等于没学

作业

觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 SQL 中继续学习:

下一课: 已经是最后一课了……

多快好省!前端后端,线上线下,名师精讲

  • 先学习,后付费;
  • 不满意,不要钱。
  • 编程培训班,我就选源栈

更多了解 加:

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧

公众号:源栈一起帮

二维码