mysql 层_mysql三层体系

为什么有连接池和线程池?

每创建一个新的会话(或链接),mysql内部创建一个新的用户线程来提供服务,当连接被销毁,线程也被销毁.即一个连接有一个线程.这种创建链接和销毁链接都会消耗cpu性能.为了降低这种消耗,有了连接池和线程池.

连接池(connection pool):

连接池:在客户端部署。客户端创建预先创建一定的连接,利用这些连接服务于客户端所有的DB请求。如果某一个时刻,空闲的连接数小于DB的请求数,则需要将请求排队,等待空闲连接处理。通过连接池可以复用连接,避免连接的频繁创建和释放,从而减少请求的平均响应时间,并且在请求繁忙时,通过请求排队,可以缓冲应用对DB的冲击。当连接断开,连接将回归连接池。

线程池(thread pool):

线程池:在服务器端部署。通过创建一定数量的线程服务DB请求,有了线程池,当有了新连接,可以直接从线程池里拿线程,断开时,也不销毁线程,而是回放进线程池。与一个线程服务一个连接的方式对比,线程池服务的最小单位是语句,即一个线程可以对应多个活跃的连接。通过线程池,可以将server端的服务线程数控制在一定的范围,减少了系统资源的竞争和线程上下切换带来的消耗,同时也避免出现高连接数导致的高并发问题。

说明:在mysql社区版无线程池功能. 在第三方perconadb 和mysql商业版有其功能.

线程池带来的问题1:调度死锁(解决方法是添加优先级队列)

引入线程池解决了多线程高并发的问题,但也带来一个隐患。假设,A,B两个事务被分配到不同的group中执行,A事务已经开始,并且持有锁,但由于A所在的group比较繁忙,导致A执行一条语句后,不能立即获得调度执行;而B事务依赖A事务释放锁资源,虽然B事务可以被调度起来,但由于无法获得锁资源,导致仍然需要等待,这就是所谓的调度死锁。由于一个group会同时处理多个连接,但多个连接不是对等的。比如,有的连接是第一次发送请求;而有的连接对应的事务已经开启,并且持有了部分锁资源。为了减少锁资源争用,后者显然应该比前者优先处理,以达到尽早释放锁资源的目的。因此在group里面,可以添加一个优先级队列,将已经持有锁的连接,或者已经开启的事务的连接发起的请求放入优先队列,工作线程首先从优先队列获取任务执行。

线程池带来的问题2:大查询处理(解决方法是设置thread_pool_oversubscribe)

某个group里面的连接都是大查询,那么group里面的工作线程数很快就会达到thread_pool_oversubscribe参数设置值,对于后续的连接请求,则会响应不及时(没有更多的连接来处理),这时候group就发生了stall。通过前面分析知道,timer线程会定期检查这种情况,并创建一个新的worker线程来处理请求。如果长查询来源于业务请求,则此时所有group都面临这种问题,此时主机可能会由于负载过大,导致hang住的情况。这种情况线程池本身无能为力,因为源头可能是烂SQL并发,或者SQL没有走对执行计划导致,通过其他方法,比如SQL高低水位限流或者SQL过滤手段可以应急处理。但是,还有另外一种情况,就是dump任务。很多下游依赖于数据库的原始数据,通常通过dump命令将数据拉到下游,而这种dump任务通常都是耗时比较长,所以也可以认为是大查询。如果dump任务集中在一个group内,并导致其他正常业务请求无法立即响应,这个是不能容忍的,因为此时数据库并没有压力,只是因为采用了线程池策略,才导致了请求响应不及时,为了解决这个问题,我们将group中处理dump任务的线程不计入thread_pool_oversubscribe累计值,避免上述问题。

连接池和线程池说明:

连接池主要用来管理客户端的连接,避免重复的连接/断开操作,是将空闲的连接缓存起来,可以复用。从而减少了连接mysql server/断开mysql server的开销与成本,从而提升性能。

但是mysql的连接池不能获取mysql server的查询处理能力以及当前的负载情况。

线程池:线程池的操作是在mysql server端,并且设计就是用来管理当前并发的连接和查询。

thread pool到底能够提升多少性能?

根据Oracle Mysql官方的性能测试:

在并发达到128个连接以后.没有线程池的Mysql性能会迅速降低。使用线程池以后,性能不会出现波动,会一直保持在较好的状态运行。

在读写模式下,128个连接以后,有线程池的Mysql比没有线程池的Mysql性能高出60倍。

在只读模式下,512个连接以后,有线程池的Mysql比没有线程池的Mysql性能高出18倍。

什么时候可以考虑使用thread_pool?

show global status like '%threads_running%';其值是mysql server当前并发执行语句的数量,如果这个值一直保持在40左右的区间,那么可以考虑使用thread pool。

如果你使用了innodb_thread_concurrency参数来控制并发的事物量,那么使用线程池将会获得更好的效果。

如果你的工作是有很多短连接组成的,那么使用线程池是有益的。

第2层sql处理层(SQL Layer):主要有SQL Interface、Parser、Optimizer、Cache和Buffer

Sql层功能:

功能:解析器,授权,优化器,查询执行,查询高速缓存,查询日志记录,跨存储引擎功能。

1.解析器:解析SQL语法,形成语法树

2.授权:SQL的权限验证  *.*对于指定的库和表

3.优化器:CBO(基于成本的优化),根据统计信息--> SQL改写 --->执行计划(即选哪种算法执行)

sql层处理数据流程:

用户传入sql-----查询缓存(命中缓存可直接返回结果)----解析器(生成sql解析树)----预处理器(可能sql等价改写)-----查询优化器(生成sql执行计划)----查询执行引擎----结果返回给用户。

SQL接口:(SQL Interface)

功能:接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface

解析器:(Parser)--生成sql解析树

SQL命令传递到解析器的时候会被解析器验证和解析(进行语义和语法的分析,分解成数据结构,如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的 ),生成sql解析树。解析器是由Lex和YACC实现的,是一个很长的脚本。

查询优化器:(Optimizer) --生成执行计划

SQL语句在查询之前会使用查询优化器对查询进行优化,根据客户端请求的 query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个 query 语句的结果,即执行计划。查询优化器使用选取-投影-联接策略生成执行计划。

选取-投影-联接:

用一个例子就可以理解: select uid,name from user where gender = 1;

这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤。

这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤。

将这两个查询条件联接起来生成最终查询结果。

查询缓存功能(Cache和Buffer):(建议关闭)

当执行sql的时候,sql第一次被执行,然后再次执行的时候如果相同的sql,可以不进行解析,直接返回结果,提高查询效率.

关闭查询缓存:query_cache_type = 0    query_cache_size = 0

局限性比较大,任何查询结果有变更,都需要进行更新,对于mysql性能影响比较严重,整个更新过程的锁颗粒度的比较高,还持有全局锁,效率很低.

建议:是否使用查询缓存,不用.(在mysql8.0里没了查询缓存功能.)

问题:如何计算和提高查询缓存命中率?

第3层储存引擎层(StorEngine Layer):

储存引擎层功能:

存储引擎,也称为表类型,真正的负责了MySQL中数据的存储和提取,储存引擎层由多种存储引擎共同组成。它们负责存储和获取所有存储在MySQL中的数据。就像Linux众多的文件系统 一样。每个存储引擎都有自己的优点和缺陷。服务器是通过存储引擎API来与它们交互的。存储引擎不能解析SQL,互相之间也不能通信。仅仅是简单的响应服务器 的请求。存储引擎不会互相通信。不同的存储引擎采用不同的技术(存储机制、索引机制、锁定机制)存储数据。

MySQL的存储引擎是插件式的,也就是说,用户可以随时切换MySQL的存储引擎:针对表或针对库都可(通过SQL语句命令)。MySQL集合了多种引擎:MyISAM、InnoDB、BDB、Merge、Memory等,默认的是InnoDB。

储存引擎层说明:

1、根据上层获取数据的方法(执行计划),将数据提取出来。

2、重新再交给SQL层。

3、是MYSQL数据库的核心,关系到数据库性能。

4、存储引擎是基于表的,而不是数据库。

常见的MySQL的存储引擎及特点:

存储引擎                   特点

InnoDB          持事务安全。但是对比MyISAM引擎,写的处效率会差些

MyISAM          支持事务,插速度般innodb快一些

Memory          数据存储于内存之中

CSV            数据存储为CSV件格式,不进转换

查看mysql储存引擎:

mysql> show plugins;           ---查看插件及其状态

mysql> show engines;          ---查看目前支持的储存引擎

InnoDB和MyISAM区别:

InnoDB                                                                                MyISAM

索引组织表                              堆表

锁                                  表锁

物理结构不同,数据索引在起(.frm)       物理结构不同,数据索引分开(.MYD .MYI)

支持事务                             不支持事务

支持外键                             不支持外键

MVCC多版本控制

INNODB缓存索引和数据                     MyISAM只缓存索引块

说明:

通过对开关binlog先后的测试发现,其实MySIAM的插性能要好于INNODB,这和MySIAM不支持事务,锁开销也较有关。但是MySiam的表锁让该引擎不能在并发下工作,因为会造成的锁冲突。在线业务OLTP业务,强烈不建议使MySIAM的存储引擎,并发效率很低。

创建表时指定储存引擎:

create table test1

(

id int,

name varchar(11)

)engine=innodb;

create table test2

(

id int,

name varchar(11)

)engine=myisam ;

InnoDB的物理存储结构:

test1.frm        #表结构文件

test1.ibd   #表数据文件(存储数据和索引)

MySIAM的物理存储结构:

test2.frm        #表结构文件

test2.MYD   #表数据文件

test2.MYI   #表索引文件

修改MyISAM表结构到InnoDB表:

alter table test2 engine = innodb;

show create table test2\G;

Create Table: CREATE TABLE `test2` (

`id` int(11) DEFAULT NULL,

`name` varchar(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

注意:MySQL 的系统表, user 等不能转化为 InnoDB 格式,他们必须采用 MyISAM 格式!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react登录页面_React 实现路由拦截

接到个新项目,使用的是React,由于React没有属于自己的路由拦截方法,只有自己封装Route成高阶组件来实现,现记录下实现的方式:首先创建一个router文件,引入项目需要展示的组件 。export const routes [{pat…

mysql 严格模式查看,如何查找和禁用MySQL严格模式?

Hello everybody I wanted to find this mysql strict mode for whmcs and disable it but i didnt had a progressIm a newbie so sry if I didnt mention other thingsCan anyone help me?Im working on WHM/Cpanel解决方案To turn off (or on) mysql strict access from cp…

linux 查找文件夹_用python打造一个基于socket的文件(夹)传输系统

这段时间在学习python,接触到了网络编程中的socket这块,加上自己在用的Linux服务器都是原生支持python的,于是乎有了个做文件传输功能程序的想法。毕竟python语言中,有下载功能的框架一抓一大把,但是主机与主机间快速搭…

mysql gtid 备份恢复_MySQL基于gtid特性与xtrabackup的数据恢复

一、gtid特性介绍:GTID(global transaction identifier)是MySQL 5.6的新特性,可以唯一的标识一个事务,由UUIDTID组成:UUID是MySQL实例的唯一标识TID是该实例上已提交的事务的数量在主从复制中,GTID代替了classic的复制…

编码gbk的不可映射字符_Python基础:编码表和字符的故事

在计算机内部,都是每8位组成的一个个字节,比如我们使用"abc".encode()把abc转化成二进制byte类型,注意byte是不可变类型: 编码过程>>> abc.encode() # 把str字符变为bytes字节类型;字符是一个个连接…

java mysql数据库编程_java JDBC数据库(mysql)编程

什么是JDBC• JDBC(Java Data Base Connectivity,Java数据库连接)• 是一种用于执行SQL语句的Java API,为多种关系数据库提供统一访问• 它由一组用Java语言编写的类和接口组成JDBC访问数据库步骤• 1:加载一个Driver驱动要通过JDBC与数据库连接&#xf…

python数据分析包pandas_Python 数据分析包:pandas 基础

pandas 是基于 Numpy 构建的含有更高级数据结构和工具的数据分析包 类似于 Numpy 的核心是 ndarray,pandas 也是围绕着 Series 和 DataFrame 两个核心数据结构展开的 。Series 和 DataFrame 分别对应于一维的序列和二维的表结构。pandas 约定俗成的导入方法如下&…

mysql 查询分析器中使用if_查询分析器中开发代码测试检查_MySQL

如果您像我一样,则可能已经花费了很多时间在查询分析器中开发代码。在您对代码感到满意之后,可以立即对开发服务器上的测试数据库运行一个或两个专设 测试。如果看起来没有什么问题,您便可以将代码投入生产。如果这是一段关键代码&#xff0c…

python文本清洗_【python】TXT文本数据清洗和英文分词、词性标注

删除空白行def clean_line (raw_file_name save_file_name):张开(raw_file_name, r )作为f_r,开放(save_file_name, w ) f_w: f_r_list 列表(设置(f()))在f_r_list句子:如果句子 \u201C\\ n\u201D: f_r_(句子)f (f_r_list)阅读文本的每一行作为一个列表,然后使用一组集合来删除…

centeros6.8 mysql_centeros7安装mysql8,以及设置root密码

2.点击下载后,在下载页面选择操作系统3.点击下载rpm文件,拿到这个下载链接4.移除mariadb数据库yum remove mariadb-libs.x86_645.进入到/tmp目录使用wget下载wget https://repo.mysql.com//mysql80-community-release-el7-2.noarch.rpm6.安装mysql的源yu…

mysql 中文字段名_MySQL全文索引怎么做?| 教程分享

- 点击上方“爱数据学习社”关注我们吧! -文末领取【商业分析资料】为什么要用全文索引我们在用一个东西前,得知道为什么要用它,使用全文索引无非有以下原因:like查询太慢、json字段查询太慢(车太慢了)没时间引入ElasticSearch、S…

centos php mysql 5.6 安装_centos 6.8 yum安装 PHP 5.6

1.检查当前安装的PHP包。yum list installed | grep php2.如果有安装的PHP包,先删除他们。先复制到文本中,编辑成一行,在执行。yum remove php.x86_64 php-cli.x86_64 php-common.x86_64 php-gd.x86_64 php-ldap.x86_64php-mbstring.x86_64 p…

leftjoin多个on条件_MYSQL|为什么LEFT JOIN会这么慢?

之前谈了怎样后台导出SAP序时账,因为导出的序时账数据量较大(3家主体公司,2017-2020年的数据),用了数据库MYSQL中的LEFT JOIN 来处理连接多表汇总数据,查询太慢啦,后来沦落到用手工分年来汇总数据,然后再导…

python 画布包括不了全部组件?_试验程序:画布版九键琴

近期有读者询问如何制作出滑动琴键连续发出声音的程序,他尝试用一排按钮充当琴键,但每次滑动只能触发一个按钮的点击事件,因此也只能发出一个声音。我提示他用画布替代按钮,他希望给予更具体的提示,于是我索性自己做了…

c 子类对象 访问父类对象受保护成员_06-JavaSe面向对象

一.static1.它是一种修饰符2.使用位置:它用来修饰成员变量和成员方法static修饰成员变量,叫类变量;static修饰成员方法,叫类方法;类成员类变量类方法没有使用static修饰成员变量,叫实例变量;没有…

keil中断函数的写法_在 KeilC里,中断子程序与函数有何不同?( )_学小易找答案

【单选题】8051单片机共有( )个中断优先级【单选题】对定时器 0 进行关中断操作,需要复位中断允许控制寄存器的: ( )【多选题】真理向谬误转化的原因,主要在于( )【多选题】“批判的武器当然不能代替武器的批判,物质的力量只能用物质的力量来摧毁,理论一经群众掌握,也会变成物质…

c++ stack 遍历_C/C++内存分配!

一、预备知识—程序的内存分配一个由c/C编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)…

python读取oracle数据到hvie parquet_关于sparksql操作hive,读取本地csv文件并以parquet的形式装入hive中...

说明:spark版本:2.2.0hive版本:1.2.1需求: 有本地csv格式的一个文件,格式为${当天日期}visit.txt,例如20180707visit.txt,现在需要将其通过spark-sql程序实现将该文件读取并以parquet的格式通过外部表的形式…

el-date-picker设置默认日期_程序员必备:Java 日期处理的十个坑

前言整理了Java日期处理的十个坑,希望对大家有帮助。一、用Calendar设置时间的坑反例:Calendar c Calendar.getInstance();c.set(Calendar.HOUR, 10);System.out.println(c.getTime());运行结果:Thu Mar 26 22:28:05 GMT08:00 2020解析&…

scope python_Python标准库Scope

作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明。谢谢!1 模块简介你一定在很多计算机科学课程上听说过作用域。它很重要,如果你不理解它的工作原理,那么就会出现一些令人…