### mysql为单进程多线程
1)守护进程
2)应用线程
网站的瓶颈一般在数据服务器。
### mysql产品选择
`mysql-client` mysql命令行工具客户端
`mysql-server` mysql服务器端
`mysql-deve`l mysql-client需要的库函数
### 程序设计语言如何与mysql交互?
嵌入式SQL:与动态SQL类似,但其语言必须在程序编译时完全确定下来;
` ODBC`(C)开放数据库互连(Open Database Connectivity
动态SQL:程序设计语言使用函数或者方法与RDBMS建立连接,向SQL服务器发送查询语句,并将结果保存到变量中
` JDBC`(Java)java数据库连接 Java Data Base Connectivity
### 插件式存储引擎
`5.5.8`:MyISAM,适合于查询比较多,修改比较少的数据库,可作为数据仓库。不支持事务;
`5.5.8后`:InnoDB,适合于在线事务处理系统;
## 数据库管理系统结构
### 简化版
![](http://i2.muimg.com/567571/f0d317b35d2e8f6a.png)
### 完整版
![](http://i1.piimg.com/567571/9a6d2d2852839e22.png)
### 官方版
![](http://i4.buimg.com/567571/6be42db89b6e31d5.png)
`连接管理器`监听在某个端口-->线程管理器-->用户模块-->命令分发模块
`解析器`:解析查询,并生成解析树,交给特定模块完成
`查询优化器`:优化查询策略,性能关键模块
`访问控制器`:负责判定操作是否有权限执行
`表管理器`:创建、读取、修改表结构定义文件,维护表描述符高速缓存(缓存在内存中),管理表锁
`表定义模块`:创建、删除、重命名、移除、更新和插入表等操作
`表修复模块`:检查、修改、备份、恢复、优化(碎片)、解析等操作
### 加载数据
最小单位是`磁盘块`,加载到内存中再做处理
数据块由存储引擎管理(Storage Engine),可以由多个磁盘块组成一个数据块
#### 文件中记录的组织
> * 堆文件组织:一条记录可以放在文件中的任意位置;更新数据方便,查询成本大,
> * 顺序文件组织:根据“搜索码”值顺序进行存放;更新数据成本比较大(使用指针,记录行的位置,数据更新时,直接更改指针,但也会带来问题:物理上相邻的数据,在逻辑上可能不相邻,读取数据时,由于逻辑数据不相邻,可能会读取多个磁盘块,因此要执行多次I/O操作,速度较慢),查询方便
> * 散列文件组织:散列函数:/4,不当的散列函数,可能使存储分配不均
### 数据字典 Data Dictionary
#### 关系的元数据
`关系名称` `字段名称` `字段类型`和`长度` `视图` `约束`
#### MySQL通配符
_:任意单个字符
%:任意长度的任意字符
#### 内置函数
user();database();version();