Mysql

Mysql被设计为一个单进程多线程架构的数据库。

在mysql命令行中可以使用system调用linux命令

Mysql数据库区别于其他数据库的特点是其插件式的表存储引擎

InnoDB存储引擎
  • InnoDB存储引擎支持事务,其设计目标是面向在线事务处理,支持行锁设计,支持外键,默认读取操作不会产生锁
  • InnoDB存储引擎的表单单独存放在一个ibd文件中.
  • InnoDB通过多版本并发控制(MVCC)来获得高并发性,并且实现了sql标准的四种隔离级别。
  • 对于表中的数据,InnoDB存储引擎采用了聚集的方式,因此每张表的存储都是按主键的顺序进行存放,如果没有显示的定义主键,InnoDB存储引擎会为每一行生成6个字节的ROWID,并以此为主键。
MyISAM存储引擎
  • MyISAM存储引擎不支持事务,支持表锁设计,支持全文索引
  • MyISAM只缓存索引文件,不缓冲数据文件
  • MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件
Memory存储引擎
  • Memory存储引擎将表中的数据存储到内存中,如果数据库重启或者发生故障,表中的数据都会消失,适用于临时存储数据的临时表,
  • Memory默认的索引是哈希索引
  • 支持表锁,不支持TEXT和BLOB类型,并发性能较差

可以使用SHOW ENGINES\G;查看MySQL数据库所支持的存储引擎

连接MySQL:连接MySQL操作是一个连接进程和MySQL数据库实例进行通信。常见的进程通信方式有:管道,共享内存,TCP/IP套接字,UNIX域套接字。

InnoDB存储引擎:是MySql5.5默认的引擎,InnoDB存储引擎是多线程的模型,因此后台有不同的线程来处理不痛的任务

master thread: 负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性

IO Thread:InnoDB使用了大量AIO(Async IO)来处理写IO请求

Purge Thread:Purge Thread来回收已经使用并分配的undo页面

InnoDB存储引擎会监控对表上各索引的查询,如果观察到建立索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引,一般时间复杂度为o(1)

异步IO:当前数据库系统都采用异步IO来处理磁盘操作(AIO),与AIO相对的是Sync IO既每次进行一次IO操作,需要等待此次操作结束才能继续接下来的操作

日志文件

日志文件分为:1)错误日志2)二进制日志3)慢查询日志4)查询日志

错误日志:用户可以通过命令show variables like 'log_error'定位文件位置,默认错误文件名为主机名称,

慢查询日志:可以在Mysql启动时设置一个阀值,将运行时间超过该值的所有sql语句都记录到慢查询日志中,

查询慢查询时间show variables like 'long_query_time'\G

查询是否设置慢查询show variables like '%slow%'

设置打开慢查询set global slow_query_long ='on'

Mysql5.1开始可以将慢查询日志记录放入一张表中show create table mysql.slow_log\G,参数log_out指定了慢查询输出的格式,默认为FILEshow variables like 'log_output'\G 可以将它改为TABLEset global log_output='table'

二进制日志:主要有一下集中作用 1)恢复 2)赋值 3)审计

在UNIX系统下本地连接Mysql可以采用UNIX域套接字方式,位置在show variables like 'socket'\G

索引组织表:如果在创建表的时候没有显示的创建主键,则InnoDB会按照下列方式来选择或者创建主键 1)首先判断表中是否有非空的唯一索引,如果有,则将该列定义为主键 2)当表中有多个非空唯一索引,InnoDB存储引擎将选择建表时第一个定义的非空唯一索引为主键

约束:实体完整性保证表中有一个主键,用户可以通过设置Primary Key和Unique Key约束来保证实体的完整性 对错误的约束:如向not null的字段插入一个null的值,Mysql数据库会将其更改为0再进行插入,如果用户想通过约束对于数据库非法数据的插入或更新,既MYSQL报错而不是警告,那么用户必须设置参数sql_mode用来严格审查输入的数set sql_mode = 'strict_trans_tables';

Mysql不支持传统的check约束,但是通过enum和set类型可以解决部分约束需求,也可以创建触发器来对表进行约束,最多可以为一个表建立6个触发器,当前Mysql只支持for each row触发方式按照每行进行触发

外键约束:外键用来保证参照完整性,一般来说,称被引用的表为父表,引用的表为子表.可定义的操作

  • cascade:当父表发生delete或update操作时,相应的子表中的数据进行delete或update操作
  • no action:当父表发生delete或update操作时跑出错误不允许这类操作发生
  • restrict:表示父表进行delete或update操作时,抛出错误,不允许这类发生

Mysql查看表的命令是show tables,但是会把视图和基本表都列出来,如果用户只想看到基本表那么执行select * from information_schema.tables where table_type ='base table' and table_schema =database()\G; 如果用户只想看到视图执行select * from information_schema.views where table_schema=database()\G;.