欢迎各位兄弟 发布技术文章
这里的技术是共享的
SQL查询语句:
早期sequel,叫做结构化查询语言 -->SQL
ansi(美国国家标准化组织)发布了SQL标准
SQL-86
SQL-89
SQL-92
SQL-99
SQL-03
SQL-08
标准规范不尽相同|
SQL语言的组成部分:
DDL
DML
完整性定义语言: 定义完整性的语言( integrated )(与DDL相关): DDL的一部分
比如 primary key,unique key
视图定义语言: 不属于 DDL
事务控制语句:
嵌入式SQL: 嵌入式SQL是嵌入到其它语言(java,php等)
动态SQL:
授权相关的: DCL
一般的数据库语言对 SQL 标准都有扩展,比如 Oracle 的叫 plsql ,sql server的叫 tsql (transact-SQL),mysql没改名,仍然叫sql,postgresql的也叫plsql ;;额外的这些东西,增加了数据程序控制结构,能够开发存储过程,存储函数,触发器,事件调度器等额外的其它的程序控制逻辑了
select 查询
笛卡尔积 (交叉连接)
自然连接
外连接,左外连接,右外连接,完全外连接等
投影: 就是select 部分列
选择: 有很多不同的语法及内置的函数来帮我们完成 就是 select 部分行
分组: 聚合计算 (如求平均值,最大值) 聚合计算后还可以做过滤,可以用 group by ,having子句等等
使用程序设计语言如何跟 RDBMS 交互,
JDBC , ODBC
嵌入式SQL: 与动态 SQL 类似,但是其语句必须在程序编译时完全确定下来,
动态SQL: 程序设计语言使用函数( 如 mysql_connect() ) 或方法与 RDBMS 服务器建立连接,并进行交互:通过建立的连接向 SQL 服务器发送查询语句,并将结果保存至变量中,而后进行处理 ( JDBC ) ( java 连接到数据库服务器的接口 , java 遵循协议发送 SQL 语句 ,数据库理解这个协议并解析执行这个SQL语句 ) ; ODBC 比 JDBC 底层得多,主要是让C语言能够与数据库交互的语句, ODBC 里面嵌入的不是 SQL 查询语句,而是 ODBC 自己函数的内置的查询逻辑(所以 ODBC 更类似于嵌入式 SQL )
嵌入式SQL与动态SQL的最大区别:
嵌入式SQL:每一个查询的机制可能需要使用变量等来保存许多数据,不是一个简单的SQL语句就能完成 ODBC 比嵌入式 SQL 更高级一点,不是真正意义上的嵌入式 SQL
动态SQL:直接发送的都是 SQL 语句
连接管理器 用于接收并处理用户请求的
解析器 解析 进行分析,词法分析,语法分析,
缓存器 (解析后发现缓存中有结果,就直接返回缓存)
查询优化器 如果缓存中没有结果,将语句完成优化 (经过解析器的生成解析树之后(比如有几个索引的语句),由优化器来选择一个最佳执行逻辑来执行) 优化器进行语句重写等各种额外的逻辑,让它的执行效率更高
存储引擎: 最后交给存储引擎来进行与数据文件交互来进行执行
mysql的存储引擎是插件式的存储引擎,与 Oracle , sql server 不一样 ; Oracle , sql server 只有一种自己的存储引擎
mysql的存储引擎是一种软件,不同组织开发的不一样(任何第三方都可以开发), 存储引擎双向转向( 表示层到物理层,物理层到表示层 ) 事务,锁都是在存储引擎中完成的 (有些存储引擎不支持事务,有些支持的非常的好) 我们可以自由选择哪一种存储引擎
mysql 5.5.8之前的默认存储引擎是 MyISAM (ISAM是一种数据存储结构) 不支持事务;MyISAM性能非常好(特别适用于查询比较多,修改比较少的场景当中,特别适合用于数据仓库)
mysql 5.5.8之后(Oracle收购mysql之后不久)的默认存储引擎是 InnoDB 支持事务 , InnoDB 工作起来,极其类似于Oracle的机制 (InnoDB 早期由Innobase公司研发的,Innobase在2008年被Oracle收购,2010年Sun被Oracle收购) InnoDB 是一种高级的存储引擎 (特别适用于在线事务处理系统,在线论坛,如discuz,在线交易,如淘宝)
连接管理器: 主要是监听在端口上
线程管理器: 主要是从线程池中取线程分配给用户请求,用户请求结束后销毁线程
用户模块: 主要是验证用户身份的
访问控制模块: 主要是看用户的权限是能具有请求的操作
优化器模块: 处理 select 负责最佳查询策略 (多种执行树,一个执行树有多个逻辑,优化器负责找的是性能最好的)
表定义模块: 处理 insert update delete
解析器: 解析,查询并生成解析树,解析树生成以后要交给特定的模块来完成 (比如纯查询语句交给优化器,增删改及create alter drop交给表定义模块)
命令分发模块: 命令分发,(是否从缓存模块中取,还是交给解析器,它们可能都要交给日志模块)
表管理器: 就是把表定义 转换成 对应的文件, ( 1,负责创建,修改,读取表定义文件(表结构)的, 2,维护表描述符高速缓存 (通常是需要把表的名称和表的定义缓存在内存当中,表被访问后,它的结构就被缓存到内存当中) 3,管理表锁 (一个用户修改表时,其它用户不能再查询或修改了) )交给存储引擎存储的
表数据和表结构是两个不同的文件
表结构定义文件
表修改模块 (表定义模块): 既操作表结构,又操作表数据 表(不是文件)创建,删除,重命名,移除,更新或插入之类的操作
表维护模块: 表的检查,修理,备份,恢复,优化(比如碎片整理,移除)及解析
状态报告模块: 比如执行了一个select 语句后,通过 show 某个变量的命令,就可以看到select次数增加了 1
表管理器:完成真正意义上的操作
出现碎片的话就会装载速度慢
块头: 保存的数据是,这个块里面保存的多少行,中间有哪些空白行
数据块: 在磁盘块的基础上实现数据块
存储引擎来负责管理数据块: (当然 存储引擎也可以直接管理磁盘块 )( 把一个磁盘块当作数据块 )
一个数据块可能由多个磁盘块组成的
定长: 执行查询速度比变长快(这是数据库优化中的一种逻辑)
变长: (如果字段数据相差太大(一个是1k,另一个是500k),用变长)
行:
定长:删除一行,后面假如插数据,直接插入空白位置,很简单
变长: 要有块头,指出里面有多少空白空间,还有可能用到位图的相关概念
文件中记录的组织:
堆文件组织:从上往下,第一行,第行.....没有顺序,简单的堆起来. 一条记录可以放在文件中的任何地方(只要有空闲空间,就往里放) (像定长一样,直接往里放数据) (维护简便,随时可以插入数据,但是查询起来困难)
顺序文件组织: 根据"搜索码"(字段)的值顺序存放 (查找,速度快:比如二分法查找,速度快;插入速度慢,因为插入中间数,后面的数要往后挪,(当然可以每行后面留几个空白行,让后来者插数据))
散列文件组织: 散列索引 (hash 索引)对应的一种机制 n个子模块(桶,散列容器),假如来了一行,插入到这个子模块当中,
( 假设年龄,,再假设我们有四个桶 我们可以除以4取余 , 这样就能确定放在哪个桶里面了 )
(假如查询,比如年龄20,除以4,取余数,为0,就对应到0桶上,这样,就在0桶里面找了)
(散列运用的好,就能基本上平均分到每个桶,散列运用的不好,有的桶里在太多,有的桶里面太少)
通常,一个表存为一个文件,
可有些存储引擎将多个表的数据放在一个文件当中
表文件两个: 表结构定义文件, 表数据文件
表空间: table space (一个文件放多个表的数据)
表空间类似于逻辑卷 ,它有点类似于逻辑卷,能自动按需增长
而且可以使用多个不同的表空间文件来存储与之与之对应的数目的表的数据?
表空间是更高级的存储管理器
顺序存储时 不但存储了自己的位置,自己的数据,还包括存储下一个指针?
(存储位置与行位置不是一回事)
(假如 下一个指针在另一个块上,当载入数据块时,还得载入下一个块 (载入数据块,就是一个IO操作,所以就会慢))
数据字典: Data Dictionary 表的元数据,称为数据字典,不叫元数据,但本质上各种关系的元数据
表名称,数据块大小,存储位置,权限等这些
关系的元数据:
关系的名字 比如 表名
字段的名字
字段的类型长度
视图
约束 比如 完整性约束
用户,授权,密码
与表中的数据本身是不同的,
安装完 mysql 后初始化,就会有个叫 mysql 的数据库,就是mysql的数据字典
任何一个数据行或记录要被操作,首先得从磁盘装载进内存中,如果需要载入的数据块大于内存空间;按照各各置换算法,把那些最近最少访问的从内存中去了,把新的载入到内存中来,这是由缓冲区管理器来管理的
缓冲区管理器: 在存储管理器里面,有个叫缓冲区管理器,来负责管理这些块的缓冲的
缓冲区管理器提供的功能:
缓存置换策略: (从内存中挪走老的不常用的,载入新的),我们可以定义哪些块不允许置换出去;;;我们不必100%,只要缓冲区达到95%,就可置换;一次置换多少
被钉住的块 (不允许被置换出去的块)
最近最少 (这里缓存置换策略中最常用的)
这一切的一切靠的是mysql服务器的变量来调整的
mysql服务器 300多个变量 30多个服务器变量来定义mysql的工作属性,300多个状态变量来输出mysql的工作状态
做dba了,每个变量都要熟,不需要任何资料,要能够为某一种应用写一个配置文件,这才是合格的dba
不可能每个变量都介绍到,,,凡是跟策略相关的,都介绍到 马哥的博客里有