yaochow@home:~$

【介绍】MySQL

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。

MEET IT

数据库

数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式存储,可以通过命令对数据进行增加、修改、删除、查询等操作。

SQL

(Structured Query Language)结构化查询语句

  • DDL(Data Definition Language)定义数据库对象

  • DML(Data Manipulation Language)操作数据表记录

  • DCL(Data Control Language)定义数据库的访问权限、安全管理

  • DQL(Data Query Language)查询数据表记录

DO IT

数据库操作

创建数据库

create database 数据库名字(character set 字符集);

查看数据库

查看服务器中所有数据库:show databases;

查看某个数据库的定义信息:show create database 数据库名字;

删除数据库

drop database 数据库名字;

其他

切换数据库:use 数据库名字;

查看正在使用的数据库:select database();

表操作

字段类型

分类 类型名称 说明
整数类型 tinyint 1字节 (-128,127) (0,255) 小整数值
  smallint 2 字节 (-32 768,32 767) (0,65 535) 大整数值
  mediumint 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
  int 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
  bigint 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
小数类型 float 单精度浮点数值
  double 双精度浮点数
  decimal 压缩严格的定点数
日期类型 year YYYY 1901~2155
  time HH:MM:SS -838:59:59~838:59:59
  date YYYY-MM-DD 1000-01-01~9999-12-03
  datetime YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~9999-12-31 23:59:59
  timestamp YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 UTC~2038-01-19 03:14:07 UTC
文本二进制 CHAR(M) M 为0~255之间的整数
  VARCHAR(M) M 为0~65535之间的整数
  TINYBLOB 允许长度0~255字节
  BLOB 允许长度0~65535字节
  MEDIUMBLOB 允许长度0~167772150字节
  LONGBLOB 语序长度0~4294967295字节
  TINYTEXT 允许长度0~255字节
  TEXT 允许长度0~65535字节
  MEDIUMTEXT 允许长度0~167772150字节
  LONGTEXT 允许长度0~4294967295字节
  VARBINARY(M) 允许长度0~M个字节的变长字节字符串
  BINARY(M) 允许长度0~M个字节的定长字节字符串

约束

primary key 主键约束

unique 唯一约束

not null 非空约束

主键约束包括唯一约束和非空约束

创建表

create table 表名 (

​ 字段名 类型(长度) 约束,

​ 字段名 类型(长度) 约束,

​ …

);

查看表

查看数据库中的所有表:show tables

查看表结构:desc 表名

删除表

drop table 表名

修改表

alter table 表名 add 列名 类型(长度) 约束;

alter table 表名 modify 列名 类型(长度) 约束;

alter table 表名 change 旧列名 新列名 类型(长度) 约束;

alter table 表名 drop 列名;

rename table 表名 to 新表名;

alter table 表名 character set 字符集;

插入记录

insert into 表名 values (值1,值2,…);

insert into 表名(列名1,列名2,…) values (值1,值2,…);

insert into 表名 values select * from 表名;

insert into 表名(列名1,列名2,…) values select (列名1,列名2,…) from 表名;

字段值字符串&日期需要加引号

更新记录

update 表名 set 字段名1=值, 字段名2=值;

update 表名 set 字段名1=值, 字段名2=值 where 条件;

字段值字符串&日期需要加引号

删除记录

delete from 表名 [where 条件];

truncate 是将表删除重新建表,auto_increment将重新记值。

SQL查询

select [distinct] * [列名1, 列名2] from 表名 [where 条件];

条件

分类   说明
比较运算符 < > <= >= = <> 小于、大于、小于等于、大于等于、等于、不等于
  between…and… 显示在某一区间的值(含头含尾)
  in(set) 显示在in列表中的值
  like 模糊查询,‘%’代表零个或多个,‘_’ 代表一个字符
  is null 判断是否为空
  and 多个条件同时成立
  or 多个条件任一成立
  not(条件) 不成立

排序

order by asc(升序)/desc(降序)

聚合函数

sum():求某一列的和

avg():求某一列的平均值

max():求某一列的最大值

min():求某一列的最小值

count():求某一列的元素个数

分组

group by

having

select语句中的列(非聚合函数列),必须出现在group by 子句中

group by 子句中的列,不一定要出现在select语句中

表之间的关系

一对一

一对多

多对多(需要中间表来实现)

外键

通常是通过外键来约束表与表之间的关系

查询原理

单表查询:根据where条件过滤表中的记录,形成中间表(用户不可见);然后根据select的选择列选择相应的列进行返回最终结果。

两表连接查询:对两表求积(笛卡尔积)并用on条件和连接类型过滤形成中间表;然后根据where条件过滤中间表的记录,并根据select指定的列返回查询结果。

多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,知道所有表都连接上为止,最终形成一个中间的结果表,然后根据where条件过滤中间表的记录,并根据select指定的列返回查询结果。

MySQL架构

Connectors

指的是不同语言中与SQL的交互

Connection Pool

  1. 管理缓冲用户连接、线程处理等需要缓存的需求。
  2. 负责监听对MySQL Server的各种请求、接收连接请求,转发所有连接请求到线程管理模块。

Management Services & Utilities

系统管理和控制工具

SQL Interface

接收用户的SQL命令,并返回永不需要的查询结果。

Parser

SQL命令传递到解析器的时候会被解析器验证和解析。

  1. 将SQL语句进行语义和语法分析,分解成数据结构,按照不同的操作类型进行分类,然后做出针对性的转发到后续步骤。
  2. 如果在分解中遇到错误,那么就说明这个sql语句是不合理的。
Optimizer

sql语句在查询之前会使用查询优化器对查询进行优化。

它使用的是“选取-投影-联接”策略进行查询。

  1. 这个select 查询先根据 where 语句进行选取,而不是先将表全部查询出来以后再进行过滤
  2. 这个select查询先根据查询属性进行属性投影,而不是将属性全部取出在进行过滤
  3. 将这两个查询条件联接起来生产最终查询结果
Cache 、 Buffer

它的主要功能是将客户端提交给MySQL select请求的返回结果集cache到内存中,与该query的一个hash值走一个对应。该query所取数据的基表发生任何数据的变化之后,MySQL会自动使该query的cache失效。

在读写比例非常高的应用系统中,query cache对性能的提高是非常显著的。当然它对内存消耗也是非常大的。

存储引擎接口
  1. 多存储引擎是MySQL有别与其他数据库的一大特性

  2. 存储引擎是基于表的,而不是数据库。

  3. MySQL 5.5 之后 默认的存储引擎由MyISAM变为InnoDB。

查看存储引擎: show engines

  InnoDB MyISAM
存储文件 .frm 表定义文件
.idb 数据文件
.frm 表定义文件
.myd 数据文件
.myi 索引文件
表锁、行锁 表锁
事务 ACID 不支持
CRUD 读、写 读多
count 扫表 专门存储的地方
索引结构 B+Tree B+Tree

MySQL物理结构

MySQL是通过文件系统对数据进行存储和管理的。

MySQL从物理结构上可以分为日志文件和数据文件。

日志文件

MySQL通过日志记录了数据库操作信息和错误信息。常用的日志文件包括错误日志、二进制日志、查询日志、慢查询日志和InnoDB引擎在线Redo日志、中继日志等。

错误日志(err log)
  1. 默认是开启的,而且从5.5.7以后无法关闭错误日志。
  2. 记录了运行过程中遇到的所有严重的错误信息,以及MySQL每次启动和关闭的详细信息。
  3. 默认的错误日志名称: hostname.err
  4. 错误日志所记录的信息是可以通过log-error和log-warnings来定义
  5. log_error可以直接定义为文件路径,也可以为ON/OFF; log_warnings只能使用1/0来定义开关启动
二进制日志(bin log)
  1. 默认是关闭的,需要通过配置:log-bin=mysql-bin进行开启。其中mysql-bin是binlog日志文件的basename,binlog日志文件的名称:mysql-bin-000001.log
  2. binlog记录了数据库所有的DDL语句和DML语句,但不包括select语句内容,语句以时间的形式保存,描述了数据的变更顺序,binlog还包括了每个更新语句的执行时间信息,binlog主要作用是用于恢复数据,因此binlog对于灾难恢复和备份恢复来说至关重要。
  3. 如果是DDL语句,则直接记录到binlog日志,而DML语句,必须通过事务提交才能记录到binlog日志中。
  4. binlog还用于实现mysql主从复制。
  5. binlog还用于数据恢复。
通用查询日志
  1. 默认情况下通用查询日志是关闭的。
  2. 由于通用查询日志会记录用户的所有操作,其中还包含增删改查等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,会影响MySQL的性能。如若不是为了调试数据库的目的建议不要开启查询日志。