要让事情改变,先改变自己;要让事情变得更好,先让自己变得更强。 ------ joker1034

MYSQL之高性能的mysql(一)

MySQL逻辑架构

 

    最上层的服务并不是MySQL所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。比如连接处理、授权认证、安全等等。

    第二层包括查询解析、分析、优化、缓存以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。
    第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。

连接管理与安全性

    每个客户端连接都会在服务器进程中拥有一个线程,服务器会负责缓存线程,因此不需要为每一个新建的连接创建或者销毁线程 。
    认证基于用户名、原始主机信息和密码。还可以使用证书认证。连接成功,服务器会验证其是否具有权限(例如,对world 数据库的Country 表执行SELECT 语句的权限)。

优化与执行

    MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询、决定表的读取顺序,以及选择合适的索引等。

并发控制

    无论何时,只要有多个查询需要在同一时刻修改数据,都会产生并发控制的问题。

读写锁

    在处理并发读或者写时,可以通过实现一个由两种类型的锁组成的锁系统来解决问题。这两种类型的锁通常被称为共享锁(shared lock)和排他锁(exclusive lock),也叫读锁(read lock)和写锁(write lock)。

锁粒度(锁策略)

    在锁的开销和数据的安全性之间寻求平衡

表锁 

    表锁是MySQL中最基本的锁策略,并且是开销最小的策略

行级锁

    行级锁可以最大程度地支持并发处理(同时也带来了最大的锁开销)

事务

    ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。

隔离级别

READ UNCOMMITTED(未提交读)

    在READ UNCOMMITTED 级别,事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读(Dirty Read)。这个级别会导致很多问题,从性能上来说,READ UNCOMMITTED 不会比其他的级别好太多,但却缺乏其他级别的很多好处,除非真的有非常必要的理由,在实际应用中一般很少使用。

READ COMMITTED(提交读)

    大多数数据库系统的默认隔离级别都是READ COMMITTED (但MySQL不是)。READ COMMITTED 满足前面提到的隔离性的简单定义:一个事务开始时,只能“看见”已经提交的事务所做的修改。换句话说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候也叫做不可重复读(nonrepeatable read),因为两次执行同样的查询,可能会得到不一样的结果。

REPEATABLE READ(可重复读)

    REPEATABLE READ 解决了脏读的问题。该级别保证了在同一个事务中多次读取同样记录的结果是一致的。但是理论上,可重复读隔离级别还是无法解决另外一个幻读(Phantom Read)的问题。所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)。可重复读是MySQL的默认事务隔离级别。

SERIALIZABLE(可串行化)

    SERIALIZABLE 是最高的隔离级别。它通过强制事务串行执行,避免了前面说的幻读的问题。简单来说,SERIALIZABLE 会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。实际应用中也很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑采用该级别。

 

 死锁

    死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。

多版本并发控制(MVCC)

    MVCC的实现,是通过保存数据在某个时间点的快照来实现的。也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。MVCC只在REPEATABLE READ 和READ COMMITTED 两个隔离级别下工作。 

MySQL的存储引擎

InnoDB存储引擎

    InnoDB是MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎。

MyISAM存储引擎

    在MySQL 5.1及之前的版本,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁,而且有一个毫无疑问的缺陷就是崩溃后无法安全恢复。

MySQL内建的其他存储引擎

Archive引擎

    Archive存储引擎只支持INSERT 和SELECT 操作,在MySQL 5.1之前也不支持索引。所以Archive表适合日志和数据采集类应用,这类应用做数据分析时往往需要全表扫描。或者在一些需要更快速的INSERT 操作的场合下也可以使用。

Blackhole引擎

    Blackhole引擎没有实现任何的存储机制,它会丢弃所有插入的数据,不做任何保存。但是服务器会记录Blackhole表的日志,所以可以用于复制数据到备库,或者只是简单地记录到日志。(碰到过很多问题,并不推荐)

CSV引擎

    CSV引擎可以将普通的CSV文件(逗号分割值的文件)作为MySQL的表来处理,但这种表不支持索引。CSV引擎可以在数据库运行时拷入或者拷出文件。

Federated引擎

    Federated引擎是访问其他MySQL服务器的一个代理,它会创建一个到远程MySQL服务器的客户端连接,并将查询传输到远程服务器执行,然后提取或者发送需要的数据。默认是禁用的。MariaDB使用了它的一个后续改进版本,叫做FederatedX。

Memory引擎

    如果需要快速地访问数据,并且这些数据不会被修改,重启以后丢失也没有关系,那么使用Memory表

Merge引擎

    Merge引擎是MyISAM引擎的一个变种。Merge表是由多个MyISAM表合并而来的虚拟表。如果将MySQL用于日志或者数据仓库类应用,该引擎可以发挥作用。但是引入分区功能后,该引擎已经被放弃。

NDB集群引擎

    2003年,当时的MySQL AB公司从索尼爱立信公司收购了NDB数据库,然后开发了NDB集群存储引擎,作为SQL和NDB原生协议之间的接口。MySQL服务器、NDB集群存储引擎,以及分布式的、share-nothing的、容灾的、高可用的NDB数据库的组合,被称为MySQL集群(MySQL Cluster)
posted @ 2020-10-20 18:39  joker1034  阅读(539)  评论(0编辑  收藏  举报

python开发&研究 - 创建于 2018年10月

这是一位python开发工程师的个人站,内容主要是python开发方面的技术文章,大部分来自学习或工作,部分来源于网络,希望对大家有所帮助。

致力于python开发&研究工作,专注python开发,关注互联网前沿技术与趋势。


Font Awesome | Respond.js | Bootstrap中文网