如何设计一个关系型数据库
要设计一个关系型数据库,首先要将其划分为两大部分,即存储部分和程序实例部分。存储部分就类似于OS文件系统,将数据最终持久化存入磁盘中,即存入机械硬盘或者SSD固态硬盘中。程序实例部分要对存储部分进行逻辑上的管理,而程序实例部分包括将数据的逻辑关系转换成物理存储关系的存储管理模块、优化执行效率的缓存模块、将SQL语句进行解析的SQL解析模块、记录操作的日志管理模块、进行多用户管理的权限划分模块、灾难恢复的容灾机制模块、优化数据查询的索引管理模块、以及使得数据库支持并发操作的锁管理模块。
数据库理论范式
| 范式 | 描述 |
|---|---|
| 1NF | 每个属性值都是不可再分的最小数据单位,即不能表中有表 |
| 2NF | 从1NF中消除非主属性对候选码的部分函数依赖 |
| 3NF | 从2NF关系中,消除非主属性对码的传递函数依赖 |
| BCNF | 从3NF基础上,消除主属性对候选码的部分依赖与传递依赖 |
MySQL注入
SQL注入 —> 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。简单来说,SQL注入就是一种通过操作输入(可以是表单,可以是get请求,也可以是POST请求等)来插入或修改后台SQL语句达到代码执行从而进行攻击的技术。
SQL注入产生的原因
程序错误 -> 程序员在编写代码的时候,没有对用户输入数据的合法性进行严格的判断和过滤,从而导致应用程序存在该漏洞。
SQL 注入的方式
- 手工注入
- 工具注入
手工注入: 在mysql手工注入中主要是利用mysql自带的information_schema数据库,information_schema这个数据库保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。
工具注入: 工具注入是可以节省很多时间,但是仅仅靠工具也不一定能利用该漏洞,因为工具有自己的局限性,不如手工那么灵活。常见的SQL注入工具有 sqlmap,BSQL、the mole…..
MySQL 主从复制
基本概念
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
主从复制的用途
- 读写分离 : 在开发工作中,有时候会遇见某个sql 语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
- 数据的实时备份: 数据实时备份,当系统中某个节点发生故障时,可以方便的故障切换
主从复制的基本原则
- 每个slave只能有一个 master
- 每个slave 只能有一个唯一的服务器 ID
- 每个master 可以有多个 salve
主从复制的步骤
- master 将改变记录到二进制日志 binary log (这些 记录过程叫做二进制日志事件 binary log events);
- salve 将 master 的 binary log events 拷贝到它的中继日志 (relay log);
- slave 重做中继日志中的事件,将改变应用到自己的数据库中;
Binlog日志的作用
- 数据恢复: 因为 Binlog 详细记录了所有修改数据的 SQL,当某一时刻的数据误操作而导致出问题,或者数据库宕机数据丢失,那么可以根据 Binlog 来回放历史数据。
- 主从复制: 想要做多机备份的业务,可以去监听当前写库的 Binlog 日志,同步写库的所有更改。
MySQL 读写分离
对数据库的更新操作往往要比查找操作更费时,对于高并发的业务场景,如果是单机部署的MySQL,会导致I/O频率过高。采用主从复制、读写分离可以提高数据库的可用性。
MySQL读写分离是指 修改操作在主库上执行,而对于查询操作,可以在从库上执行。主要目的是分担主库的压力。主库压力太大,无法承载业务,通过实现读写分离还能进一步提升数据库的负载性能。对于高访问量的业务场景,MySQL读写分离显得格外重要。
一条SQL 语句的 执行顺序
一条 SELECT语句的定义如下:
1 | <SELECT clause> [<FROM clause>] [<WHERE clause>] [<GROUP BY clause>] [<HAVING clause>] [<ORDER BY clause>] [<LIMIT clause>] |
一条基本的SELECT语句的执行流程如下:
- from:需要从哪个数据表检索数据
- where:过滤表中数据的条件
- group by:如何将上面过滤出的数据分组
- having:对上面已经分组的数据进行过滤的条件
- select:查看结果集中的哪个列,或列的计算结果
- order by :按照什么样的顺序来查看返回的数据
- limit : 添加返回限制
参考资料