初识MySQL

一、MySQL介绍

大家都是知识MySQL是一种数据库,数据库又是什么呢?

数据库是按照数据结构来组织、存储和管理数据的仓库,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。

MySQL中的SQL是 结构化查询语言(Structured Query Language),与C/C++一样是编程语言,是一种数据库查询和程序设计语言,用于 存取数据 以及 查询、更新 和 管理 关系数据库系统。SQL是关系数据库系统的标准语言。

关系型数据库包括:MySQL, SQL Server, Oracle, Sybase, postgreSQL 以及 MS Access等。

SQL命令包括:DQL、DML、DDL、DCL以及TCL。

DQL语句:Data Query Language - 数据查询语言,select语句从一个或者多个表中检索特定的记录;

DDL语句:Data Define Languge - 数据定义语言,主要用来定义数据库,表名,字段,例如create,创建一个新的表、表的视图、或者在数据库中的对象。drop,删除表、数据库对象或者视图。alter,修改现有的数据库对象,例如修改表的属性或者字段。

DML语句,Data Manipulate Language - 数据操作语言,用来对数据记录进行增删改查,还用来保证数据的一致性。主要有delete,删除记录。insert,插入记录。update,更新记录。查找可以采用select语句。

DCL语句,Data Control Language - 数据控制语言,用于控制不同数据对象访问级别的语句。定义了数据库、表、用户的访问权限和级别。常用的语句包括grant,授予用户权限、revoke,收回用户权限等

TCL语句,Transaction Control Language - 事务控制语言,用来确保事务的特性。如,commit,事务提交。rollback :事务回滚。

数据库术语

数据库:数据库是一些关联表的集合。

数据表:表是数据的矩阵。

列:一列包含相同类型的数据。

行:或者称为记录是一组相关的数据。

主键:主键是唯一的,一个数据表只能包含一个主键。

外键:外键用来关联两个表,来保证参照完整性。MyISAM存储引擎本身并不支持外键,只起到注释作用,而innodb完整支持外键。

复合键:或称组合键,将多个列作为一个索引键。

索引:用于快速访问数据表的数据,索引是对表中的一列或者多列的值进行排序的一种结构。

二、MySQL体系结构

MySQL体系结构

上图重要分为两大部分,connectors、MySQL Server。

connectors中表示的是客户端实现连接MySQL的驱动,实现MySQL的协议,客户端与MySQL服务器进行连接底层基本都是TCP/IP协议。

MySQL主要由以下几部分组成:

连接池组件(connection pool)、管理服务和工具组件(Enterprise Management)、SQL接口组件(SQL Interface)、查询分析器组件(Parser)、优化器组件(Optimizer)、缓冲组件(Caches & Buffer)、插件式存储引擎(Pluggable Storage Engines)、物理文件(File System)。

连接池组件(connection pool)

连接池主要是 管理缓冲用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求,MySQL网络处理模型具体如下。

连接池

如上图,主线程 使用IO多路复用select函数进行管理网络事件,函数中的第一个参数是listenfd,第二个是读事件,第三个是写事件,第四个是错误事件,第五个是超时时间,给的是0,表示阻塞等待客户端的连接。当建立连接后,执行accept函数,分配一个新的clinetfd。然后在执行mysql_thread_create函数给这个clinetfd分配一个线程,这些连接线程组成了连接池。每个连接都对应一个线程,线程中执行while(1) int n = read(clientfd),前面没有设置clientfd为非阻塞,所以read是阻塞的IO函数,会一直在while(1) int n = read(clientfd) 中阻塞等待数据的到达。每个线程都是这样的,当数据到底后,进行数据的解析,根据解析出的语句执行相应的操作(如,插入、查询、删除等)。(采用select是因为select的跨平台,并且连接数量不多)(IO多路复用select + 阻塞的io)

从上面连接池的工作过程可以得知,连接池是多线程的,连接线程是解析数据,执行相应的SQL语言。所以MySQL命令处理是并发处理的,这样可以快速的响应MySQL的数据,加快处理速度。连接池的作用还包括:权限验证、线程回收、连接数量的限制(一般是800)、检查内存等。

管理服务和工具组件(Enterprise Management)

它的主要是系统管理和控制工具,例如备份恢复、Mysql复制、集群、安全、主从复制、分区等等。

SQL接口组件(SQL Interface)

它主要是负责整理语句,将SQL语句解析生成相应对象,DML,DDL,存储过程,视图,触发器等。

查询分析器组件(Parser)

将SQL对象交由解析器验证和解析,并生成语法树。并且对权限进行验证,验证语句有没有这个权限,能不能执行。db、table、列等要执行操作有的时候是需要权限的。根据这个权限进行过滤。

优化器组件(Optimizer)

它是进行语句的优化

缓冲组件(Caches & Buffer)

它是一块内存区域,用来弥补磁盘速度较慢对数据库性能的影响,在数据库进行读取页操作,首先将从磁盘读到的页存放在缓冲池中,下一次再读相同的页时,首先判断该页是否在缓冲池中,若在缓冲池命中,直接读取,否则读取磁盘中的页,说明该页被LRU淘汰了。缓冲池中LRU采用最近最少使用算法来进行管理。

缓冲池缓存的数据类型有:索引页、数据页、以及与存储引擎缓存相关的数据(比如innodb引 擎:undo页、插入缓冲、自适应hash索引、innodb相关锁信息、数据字典信息等)。

插件式存储引擎(Pluggable Storage Engines)

插件式存储引擎种类存储引擎的概念与种类

存储引擎是MySQL中具体与文件打交道的子系统,是根据MySQL AB公司提供的文件访问层抽象接口定制的一种文件访问机制。

物理文件(File System)

存储在磁盘中的数据库文件。

数据库设计三范式

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库, 必须满足一定的范式。

范式一:确保每列保持原子性,数据库表中的所有字段都是不可分解的原子值。

范式二:确保表中的每列都和主键相关,而不能只与主键的某一部分相关(组合索引)。

范式三:确保每列都和主键直接相关,而不是间接相关,减少数据冗余。

三、CRUD

CRUD语句执行大致过程如下。

-- 创建数据库 CREATE DATABASE`数据库名`DEFAULT CHARACTER SET utf8; -- 删除数据库 DROP DATABASE`数据库名`; -- 选择数据库 USE`数据库名`; -- 创建表 CREATE TABLE `table_name` (column_name column_type); CREATE TABLE IF NOT EXISTS `0voice_tbl` ( `id` INT UNSIGNED AUTO_INCREMENT COMMENT 编号, `course` VARCHAR(100) NOT NULL COMMENT 课程, `teacher` VARCHAR(40) NOT NULL COMMENT 讲师, `price` DECIMAL(8,2) NOT NULL COMMENT 价格, PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT = 课程表; -- 删除表 DROPTABLE`table_name`; -- 清空数据表 TRUNCATE TABLE `table_name`; -- 截断表,有自增索引的话,从初始值开始累加 DELETE TABLE `table_name`; -- 逐行删除,有自增索引的话,从之前值继续累加 -- 增 INSERT INTO `table_name`(`field1`, `field2`, ..., `fieldn`) VALUES (value1, value2, ..., valuen); INSERT INTO `0voice_tbl` (`course`, `teacher`, `price`) VALUES (C/C++Linux服 务器开发/高级架构师, Mark, 7580.0); -- 删 DELETE FROM `table_name` [WHERE Clause]; DELETE FROM `0voice_tbl` WHERE id = 3; -- 改 UPDATE table_name SET field1=new_value1, field2=new_value2 [,fieldn=new_valuen] UPDATE `0voice_tbl` SET `teacher` = Mark WHERE id = 2; -- 累加 UPDATE `0Voice_tbl` set `age` = `age` + 1 WHERE id = 2; -- 查 SELECT field1,field2,...field NFROM table_name [WHERE Clause]

四、正则表达式

五、视图

视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。其内容由查询定义。

基表:用来创建视图的表叫做基表。通过视图,可以展现基表的部分数据。

视图数据来自定义视图的查询中使用的表,使用视图动态生成。

优点

1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件、筛选条件,对用户来说已经是过滤好的复合条件的结果集。

2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。

3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响,源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

作用

1)可复用,减少重复语句书写,类似程序中函数的作用。

2)重构利器。

3)逻辑更清晰,屏蔽查询细节,关注数据返回。

4)权限控制,某些表对用户屏蔽,但是可以给该用户通过视图来对该表操作。

六、触发器

触发器(trigger)是MySQL提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如,当对一个表进行DML操作( insert , delete , update )时就会激活它执行。

监视对象: table

监视事件: insert 、 update 、 delete

触发时间:before ,after

触发事件: insert 、 update 、 delete

七、存储过程

SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不 同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中 的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。

特点

1)能完成较复杂的判断和运算。2)可编程行强,灵活。3)SQL编程的代码可重复使用。4)执行的速度相对快一些。5)减少网络之间的数据传输,节省开销。