高性能mysql一.mysql系统结构和概念


前言:mysql架构设计将查询处理和其他系统任务和数据的存储/提取相互分离,这种存储和处理分离,可以在使用时根据性能,特性,以及其他需求选择数据的存储形式

1.1Mysql逻辑架构

简化版
官网

1.1.1连接管理和安全性

连接管理:每个客户端连接都会在服务器进程中拥有一个线程,服务端会负责缓存线程,不需要为每个新建的连接创建或者销毁线程
权限管理:客户端连接服务端需要auth验证,连接成功后继续判断是否有操作某表或者库的权限

1.1.2优化与执行

mysql会对解析后的sql进行重写查询,决定表读取顺序,选择合适索引等,可以通过explain进行查看优化情况

1.2并发控制

mysql会在服务层与存储引擎层两个方面解决并发问题

1.2.1读写锁

在处理并发读或者并发写时,可以通过实现两种类型的组成的锁系统来解决问题,共享锁,也叫读锁, 排他锁也叫血锁

1.2.2锁粒度

锁策略就是在锁的开销和数据的安全性之间寻找平衡
表锁:是mysql最基本的锁策略,开销最小,在特定的情况下,表锁也可能具有良好的性能,另外,写锁也比读锁具有更高的优先级
行级锁:最大程度支持并发,同时带来最大的锁开销

1.3事务

事务就是一组原子性的sql查询,或者是说一个独立的单元
ACID:表示原子性atomicity 一致性consistency 隔离性isolation 持久性durability

1.3.1隔离级别

Read uncommitted未提交
事务A修改,但没提交, 事务b是可以读到的, 这也成为脏读

Read committed提交度
大多数数据库默认级别,一个事务在开始时 , 可以"看到"所有已经提交的事务所做的修改, 也就是说,两次执行同样的查询,读到的结果可能不一样,这个级别有时也称为不可重复读

Repeatable read可重复读
解决了脏读,该级别保证在同一个事务中多次读取相同的记录结果是一样的; 但理论上,该级别无法解决另一个幻读的情况, 目前Innodb和xtradb存储引擎通过mvcc多版本并发控制解决了幻读问题

Seriaizable串行化
强制事务串行化执行

1.3.2死锁

死锁是指两个及以上事务在同一个资源上相互占用,相互等待,产生恶性循环
解决方案:一.死锁检测,检测死锁的虚幻依赖
二.检测查询时间是否达到锁等待时间
innodb处理死锁的方法是,将持有最少行级锁的事务进行回滚

1.3.3事务日志

事务日志可以帮助提高事务的效率.使用事物日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把修改行为记录到持久在硬盘的事务日志中,而不用每次将修改的数据本身持久到磁盘;
事务日志采用追加的方式,在磁盘上开辟一小块区域内进行顺序i/o, 不像随机io需要在磁盘上移动磁头;
事务日志持久以后,内存中被修改的数据在后台可以慢慢刷回磁盘,我们称之为预写式日志write ahead logging 修改数据需要写两次磁盘

1.3.4mysql中的事务

mysql提供两种事务型存储引擎,innodb和NDB Cluster
自动提交
mysql默认采用自动提交autocommit,也就是说,如果不是显性开始事务,则每个查询都会被当成一个事务执行提交操作
show variables like “autocommit”

DDL数据定义语言,如果导致大量数据改变的操作如alter table ,lock tables等会在执行前强制执行commit提交当前的活动事务

1.4多版本并发控制

MVCC的实现,是通过保存数据在某个时间点的快照来实现的.
Innodb的MVCC,是通过在每个记录后面保存两个隐藏列来实现的;这两个列,一个保存了行的创建时间版本号,一个是删除时间版本号;每开始一个新的事务,系统版本号都会自动递增,事务开始时刻的版本号作为事务的版本号,用来和查询到的每行记录版本号进行对比, 在repeatable read级别下 mvcc是如何操作的
SELECT
a.Innodb只查询小于等于当前事务版本的数据行,目的是保证查到的数据是之前存在或则当前事务插入或者修改的
b.行删除版本要么未定义,要么大于当前事务版本号,保障读到的行在时候之前未被删除
INSERT
Innodb为新插入的每一行保存当前系统版本号作为当前行的版本号
DALETE
Innodb为删除的每一行保存当前系统版本号作为删除标识
UPDATE
Innodb为插入一行新记录,保存当前系统版本号作为当前行版本号,同时保存当前系统版本号到原来的行作为删除标识

保存了两个而外的系统版本号,使大多数读操作不用加锁,操作简单,性能很好,但是使用了额外空间,需要做更多检查的工作,以及额外的维护工作
!!注意 MVCC只在repeatable read 和 read commit两种级别下工作,其他两种级别与mvcc不兼容

1.5mysql存储引擎

在文件系统中,mysql每个数据库(也称为schema)保存少数据目录下一个子目录,创建表时,在目录下创建一个和表同名的.frm文件
可通过获取表信息
show table status like “tablename”

1.5.1Innodb存储引擎

Innodb是mysql默认的事务引擎,Innodb的性能和自动奔溃恢复特性,使得它在非事务型存储的需求中也很流行
Innodb概览
在mysql4.1版本后,Innodb将每个表的数据和索引放在当读的文件
Innodb通过mvcc支持高并发,通过间隔锁next-key-locking防止幻读的出现
Innodb表是基于聚簇索引建立的,聚簇索引对主键查询有很高的性能,不过它的二级索引中必须包含主键索引
从mysql4.1开始,将每个innodb引擎的表单独存放在一个独立的ibd文件中

1.5.2mylsam存储引擎

在5.1及以前版本,mylsam是默认的存储引擎,提供了大量的特性,包括全文检索,压缩,空间函数等,但不支持事务和行级锁,最重要的是不支持崩溃恢复
存储:表会放到两个文件 数据文件.myd 和 索引文件myi

1.5.3查看数据库支持的引擎
show engines

在这里插入图片描述

1.5.4支持的通信方式

1.TCP/IP
TCP/IP是mysql数据库在任何平台都支持的连接方式,也是网络中使用最多的方式之一.
2.命名管道和共享内存
3.Unix域套接字
这不算是一种网络协议,在Linux和Unix环境下,需保证mysql客户端和服务端在同一台服务器上使用

1.5.5转换表的引擎

alter table
优点:适用任何引擎
缺点:执行时间过长
导出与导入
适用mysqldump工具导出文件,然后修改文件中create table语句中存储引擎语句
创建与删除
该方法比第一种高效比第二种安全 ,县创建新表 通过insert … select导出数据

参考:高性能mysql mysql技术内幕-innodb

发布了235 篇原创文章 · 获赞 221 · 访问量 96万+

猜你喜欢

转载自blog.csdn.net/drdongshiye/article/details/104936048