最近参与了一些线上的工作,开始关注mysql数据库的在开发中遇到的各种问题,很久没有输入,决定读一读书,学习和mysql相关的知识,顺便记个笔记。于是就有了这篇博客。
DBMS设计对比
DBMS
win
linux
mysql
单进程多线程
sqlserver
单进程多线程
oracle
单进程多线程
多进程
mysql实例
每一个启动的mysql进程都被称作一个实例,数据库实例真正用于操作数据库文件,mysql实例 = 后台线程+共享内存区。一个实例通常对应一个数据库,在集群情况下可能存在一个数据库被多个实例使用的情况。
bin>./mysqld_safe& #启动数据库实例
bin>ps -ef|grep mysqld #查看mysql进程
bin>mysql --help|grep my.cnf #查看启动时读取配置的顺序
mysql可以无配置文件启动,此时会按照编译时的默认参数设置启动实例。如果多个配置文件中配置冲突,会以最后一个读到的配置为准。
linux系统中mysql的默认配置
datadir=/ust/local/mysql/data
可以通过sql查询:show variables like 'datadir'\G;
通常情况下data目录的权限应该为mysql:mysql
数据库体系结构
存储引擎
其中插件式存储引擎时mysql最重要的特点,存储引擎是基于表而不基于数据库。用户还可以根据自己的需求对存储引擎进行重新开发或二次开发。Innodb本身也是第三方存储引擎,后被Oracle收购。
Innodb —— mysql5.5.8之后默认的存储引擎
锁
支持行级锁,非锁定读(读操作不产生锁)。
高性能和高可用
通过MVCC(多版本并发控制)实现高并发、标准4种隔离级别(默认REPEATABLE)、采用next-key 策略避免phantom幻读;
数据存储
采用聚集方式(clustered)。每张表都按照主键顺序存放在一个独立的ibd文件中,如未制定主键,会自动生成6字节ROWID。