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;.