欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 32_01 _mysql系列之一关系型数据库基础理论 有大用

image.png

image.png

image.png


image.png



关系模型:  (结构化数据模型) 

        关系模型    

        实体-关系模型

        对象关系模型:基于对象的数据模型

               <name>Jerry</name>

               <age>50</age>

                gender:

                

                name:

                uid:


                name:uid:birthdate:                


                name:age:gender

                name:uid:birthdate


关系: 关系代数运算, 例如:求两个集合的交集,并集,差集,补集

        交集:共有部分

        并集:集合加起来

        差集:属于A但不懂于B

        全集:全部的集合

        补集:全集减去我们的集合


SQL: structrue query language 结构化查询语言


诞生于 rbm的 System R  (第一款关系型数据库)

大约1970年, System R 的接口: SQL

后来的关系型数据库 Ingres,Oracle,Sybase


SQL语言:第四代语言,用户不需要去定义额外的数据结构,就能够去实现执行的语言

美国国家标准委员会(ANSI)制定SQL标准: ansi-sql

sql86,sql92,sql99

按照标准生成年份,来定义sql标准的


DML:(Data Manipulation Language)数据操作语言        增删改查 insert delete select update

        

DDL: (Data Definition Language)数据定义语言  用来定义对象的 可以使用create定义的 是用来实现存储和定义的   可以用来定义,删除,修改这些对象的

        create ,drop ,alter 


DCL:  (Data Control Language) 数据控制语言 用来定义数据库中用户的访问权限的

          grant 

          revoke



       

RDB对象:

    库,表,索引,视图,用户,存储过程,存储函数,触发器,事件调度器(定义执行任务的,类似于crontab)

    约束: 比如年龄230,所以要定义它的有效存储范围 

            域约束:每个属性自己的约束:数据类型约束 比如数字,不能填为字母

            外键约束:引用完整性约束,

            主键约束: 一个或多个字段表示唯一的此字段所属的实体,不能为空 ;只能有一个主键

                        (候选键:可以拿来当作主键的键)

                        比如 /etc/passwd 用户名都不一样,可以作主键

            唯一性约束: 也是唯一可以表示此字段所属的实体, 每一行的某字段都中允许出现重复值,可以为空        可以有多个唯一键

            检查性约束: 比如 age: int(4字节,可表示4亿),所以可以明确定义 >0 ,<150 ;mysql对检查性约束的能力有限  但是 oracle,sql server 都支持检查性约束


        约束:constraint 




image.png




关系型数据库

     表示层: 库,表,字段等等,最重要的是表

     逻辑层: 存储引擎,解构

     物理层: 数据文件(既包括数据,又包含数据库系统的元数据,不是文件文件,不能使用vim直接打开)


关系型数据库的两个核心组件: 存储管理器,查询管理器


数据的存储和查询

    存储管理器

        1)权限及完整性(约束关系)管理器

        2)事务管理器(例如:两个账号,一个增加500,另一个减少500)

        3)文件管理器 (文件与表是有对应关系的)

        4)缓冲区管理器  (查询,修改在内存中完成,得把数据从磁盘读入内存,缓冲区管理器就是管理缓冲空间的)(如:一个表50G,要读进内存哪些数据,从内存中清掉哪些数据,都是由缓冲区管理器来管理的)

       

     查询管理器  负责接受并理解用户的请求,并且将查询请求提交给存储管理器,来实现真正的数据管理的

        1)   DDL 解释器 定义表结构  重要

        2)   DML 解释器 来查询      理解,解析DML语句,交给查询管理器的   重要

        3)   DCL 解释器

        4)   查询执行引擎 解析,分析后就要执行了

        5)   缓存


image.png



数据库一般是不允许一个线程响应多个请求的

    为了避免权限交叉


mysql 单进程

           多线程

                守护线程,完成将缓冲区写到磁盘上去

                应用线程(用户线程),用户请求退出后,这个线程就没了

                        10个用户

                                第一个用户需要载入 256M

                                第二个用户需要载入 1G

                                第三个用户需要载入 256M

                所以消耗内存非常大,所以数据库服务器通常是一个系统的最慢的节点所在,所以尽可能避免与数据库交互,所以尽量使用缓存;;;对于一个繁忙的数据库来讲,创建,撤销连接请求也要消耗大量的资源;;所以我们要线程重用(Tread reuse)(把请求放在线程池里面)


        x86 32位: 内存4G,内核占1G,事实上mysql有效使用的只有 2.7G左右 (哪怕总内存256G)

               64位: 

                        smp:对称多处理器,mysql的一个查询语句,只能在一个cpu上运行,如果把mysql语句解构下来多个语句,在多个cpu上运行,速度会很快;;;但是 mysql 不行

                         可以把 mysql 做分区,可以用100台服务器组合起来(做成一个农场)来完成一个mysql任务



image.png


image.png



关系运算:

        主要就是实现mysql语句的执行 (返回部分内容或全部内容)

        投影: 只显示部分字段 (只输出指定属性)

        选择: 只显示部分行 (只输出符合条件的行) WHERE  选择元组

        自然连接: 两张表各出一个字段,如果字段值相等,进行连接的结果 (具有相同名字的属性上所有取值相同的行)

        笛卡尔积 (交叉连接)

        并: 集合运算  union (两张表老师表学生表,从老师表中查出姓名 年龄,,从学生表中查出姓名 年龄 ,再组合起来)

image.png


(a+b)*(c+d) = ac+ad+bc+bd


在内存先进行笛卡尔,(耗的内存比较多),再进行 自然连接

普通分类: