Mysql高级知识概括

  • Mysql高级简介
  • Mysql存储引擎
  • MYSQL配置文件
  • MYSQL日志
  • MVCC
  • MYSQL锁机制
  • 主重复制与读写分离
  • Mysql分区分表分库
  • MYSQL字符集与字符序
  • MYSQL高级其他
  • Mysql命令以及内置变量

Mysql高级简介

MySQL高级简介:

  • MySQL高级部分包含:
    ①mysql内核
    ②sql优化工程师
    ③mysql服务器的优化
    ④查询语句优化
    ⑤主重复制
    ⑥软硬件升级
    ⑦容灾备份
    ⑧sql编程
  • 完整的mysql优化需要很深的功底,大公司甚至有专门的DBA。

Mysql日志文件:

  • 重做日志(redo log):确保事务的持久性。
  • 回滚日志(undo log):保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC)。
  • 二进制日志(binlog):主从复制。
  • 错误日志(errorlog):默认是关闭的,记录严重的警告和错误信息,每次启动和关闭的详细信息等。
  • 慢查询日志(slow query log):它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
  • 一般/全局/通用查询日志(general log):用来记录用户的所有操作,包括启动和关闭 MySQL 服务、更新语句和查询语句等。默认情况下,通用查询日志功能是关闭的
  • 中继日志(relay log):Mysql 主节点将binlog写入本地,从节点定时请求增量binlog,主节点将binlog同步到从节点。从节点单独进程会将binlog 拷贝至本地 relaylog中。

Mysql配置文件:

  • 位置:
    ①windows:my.ini文件。
    ②Linux:/etc/my.cnf文件。
  • 简介:修改这个文件可以达到更新配置的目的。

数据文件:

  • 位置:
    ①windows:D:\ProgramFiles\MySQL\MySQLServer5.5\data目录下可以挑选很多库
    ②linux:看看当前系统中的全部库后再进去,默认路径:/var/lib/mysql
  • frm(meta)文件: 存放表结构。
  • myd(data)文件: 存放表数据。
  • myi(index)文件: 存放表索引。

Mysql逻辑分层架构简介:

  • 和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分高。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。
  • 分层:
    连接层:最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcplip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
    服务层:第二层架构主要完成大多少的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用素引等,最后生成相应的执行操作。如果是select语句,服务器还会查询内部的缓存。如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。
    引擎层:存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。后面介绍MylSAM和InnoDB。
    存储层:数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。
  • 各层组件:
    Connectors:指的是不同语言中与SQL的交互。
    Management Serveices & Utilities:系统管理和控制工具。
    Connection Pool:连接池。
    <1>管理缓冲用户连接,线程处理等需要缓存的需求。
    <2>负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。
    SQL Interface:SQL接口。接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
    Parser:解析器。
    <1>SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。
    <2>在 MySQL中我们习惯将所有 Client 端发送给 Server 端的命令都称为 query ,在 MySQL Server 里面,连接线程接收到客户端的一个 Query 后,会直接将该 query 传递给专门负责将各种 Query 进行分类然后转发给各个对应的处理模块。主要功能:
    (1) 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后做出针对性的转发到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。
    (2)如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
    Optimizer: 查询优化器。
    <1>SQL语句在查询之前会使用查询优化器对查询进行优化。就是优化客户端请求的 query(sql语句) ,根据客户端请求的 query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个 query 语句的结果。
    <1>他使用的是“选取-投影-联接”策略进行查询。用一个例子就可以理解: select uid,name from user where gender = 1;
    (1)这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤
    (2)这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤
    (3)将这两个查询条件联接起来生成最终查询结果
    Cache和Buffer:查询缓存。
    <1>他的主要功能是将客户端提交 给MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值 做一个对应。该 Query 所取数据的基表发生任何数据的变化之后, MySQL 会自动使该 query 的Cache 失效。在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。
    <2>如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等
    存储引擎接口:
    <1>存储引擎接口模块可以说是 MySQL 数据库中最有特色的一点了。目前各种数据库产品中,基本上只有 MySQL 可以实现其底层数据存储引擎的插件式管理。这个模块实际上只是 一个抽象类,但正是因为它成功地将各种数据处理高度抽象化,才成就了今天 MySQL 可插拔存储引擎的特色。
    <2>MySQL区别于其他数据库的最重要的特点就是其插件式的表存储引擎。MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者都可以按照自己的意愿来进行开发。
    <3>注意:存储引擎是基于表的,而不是数据库。

mysql执行过程以及顺序:

  • 链接:mysql执行过程以及顺序

Mysql存储引擎

Mysql存储引擎简介:

  • 存储引擎查看命令:
    ①看你的mysql现在已提供什么存储引擎:show engines;
    ②看你的mysql当前默认的存储引擎:show variables like '%storage_engine%";
  • 商业选型:
    ①Percona为MySQL数据库服务器进行了改进,在功能和性能上较MySQL有着很显著的提升,该版本提升了在高负载情况下的 InnoDB的性能、为DBA提供一些非常有用的性能诊断工具;另外有更多的参数和命令来控制服务器行为。阿里巴巴大部分mysql数据库其实使用的percona的原型加以修改。

MyISAM和InnoDB区别:

对比项 MyiSAM InnoDB
主外键 不支持 支持
事务 不支持 支持
行表锁 表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作 行锁,操作时只锁某一行,不对其它行有影响,适合高并发的操作
缓存 只缓存索引,不缓存真实数据 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响
表空间
关注点 性能 事务
默认安装 Y Y

MYSQL配置文件

MYSQL配置文件详解:

  • 客户端的参数:[client]和[mysql]都是客户端,下面是参数简介:
    ①port参数表示的是MySQL数据库的端口,默认的端口是3306,如果你需要更改端口号的话,就可以通过在这里修改。
    ②default-character-set参数是客户端默认的字符集,如果你希望它支持中文,可以设置成gbk或者utf8。
    ③这里还有一个password参数,在这里设置了password参数的值就可以在登陆时不用输入密码直接进入
  • 服务器端参数:以下是参数的简介:
    ①port参数也是表示数据库的端口。
    ②basedir参数表示MySQL的安装路径。
    ③datadir参数表示MySQL数据文件的存储位置,也是数据库表的存放位置。
    ④default-character-set参数表示默认的字符集,这个字符集是服务器端的。
    ⑤default-storage-engine参数默认的存储引擎。
    ⑥sql-mode参数表示SQL模式的参数,通过这个参数可以设置检验SQL语句的严格程度。
    ⑦max_connections参数表示允许同时访问MySQL服务器的最大连接数,其中一个连接是保留的,留给管理员专用的。
    ⑧query_cache_size参数表示查询时的缓存大小,缓存中可以存储以前通过select语句查询过的信息,再次查询时就可以直接从缓存中拿出信息。
    ⑨table_cache参数表示所有进程打开表的总数。
    ⑩tmp_table_size参数表示内存中临时表的总数。
    ⑪thread_cache_size参数表示保留客户端线程的缓存。
    ⑫myisam_max_sort_file_size参数表示MySQL重建索引时所允许的最大临时文件的大小。
    ⑬myisam_sort_buffer_size参数表示重建索引时的缓存大小。
    ⑭key_buffer_size参数表示关键词的缓存大小。
    ⑮read_buffer_size参数表示MyISAM表全表扫描的缓存大小。
    ⑯read_rnd_buffer_size参数表示将排序好的数据存入该缓存中。
    ⑰sort_buffer_size参数表示用于排序的缓存大小
  • InnoDB存储引擎使用的参数,以下是参数的简介:
    ①innodb_additional_mem_pool_size参数表示附加的内存池,用来存储InnoDB表的内容。
    ②innodb_flush_log_at_trx_commit参数是设置提交日志的时机,若设置为1,InnoDB会在每次提交后将事务日志写到磁盘上。
    ③innodb_log_buffer_size参数表示用来存储日志数据的缓存区的大小。
    ④innodb_buffer_pool_size参数表示缓存的大小,InnoDB使用一个缓冲池类保存索引和原始数据。
    ⑤innodb_log_file_size参数表示日志文件的大小。
    ⑥innodb_thread_concurrency参数表示在InnoDB存储引擎允许的线程最大数。
  • 链接:MySQL配置文件-my.ini

MYSQL日志

一般/全局/通用查询日志(general log)简介:

  • 命令:
    ①开启:set global general_log=1;
    ②设置输出位置:set global log_output='TABLE";
    ③此后你所编写的sql语句,将会记录到mysql库里的general_log表,可以用下面的命令查看select * from mysql.general_log;
  • 注意:
    ①永远不要在生产环境开启这个功能。
    ②一般在测试环境中使用此功能。
  • 链接:MySQL通用查询日志(General QueryLog)

undo log简介:

  • 为了实现事务原子性,要么全部完成commit,要么全部回滚rollback,Innodb用于实现mvcc(多版本并发控制)
  • 例如:将user=’A’ 改为 user=’B’,则undo log中会记录下user=’A’和事务版本等信息
  • 一旦事务完成,所有修改必须被记录下,保证数据一致性(后面redo log解释)

redo log简介:

  • redo log是InnoDB存储引擎层的日志,又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。在实例和介质失败(media failure)时,redo log文件就能派上用场,如数据库掉电,InnoDB存储引擎会使用redo log恢复到掉电前的时刻,以此来保证数据的完整性。
  • 在一条更新语句进行执行的时候,InnoDB引擎会把更新记录写到redo log日志中,然后更新内存,此时算是语句执行完了,然后在空闲的时候或者是按照设定的更新策略将redo log中的内容更新到磁盘中,这里涉及到WAL即Write Ahead logging技术,他的关键点是先写日志,再写磁盘。
  • 有了redo log日志,那么在数据库进行异常重启的时候,可以根据redo log日志进行恢复,也就达到了crash-safe。
  • redo log日志的大小是固定的,即记录满了以后就从头循环写。

bin(二进制) log简介:

  • redo log可以实现数据重做,那为什么要使用binlog?
    因为redo log是Innodb实现的物理日志,一旦涉及到多种存储引擎,无法进行重做。
  • bin log 记录下所有数据的更改,可用于本机数据恢复和主从同步。
  • 刷入磁盘的方式:每个1s刷入磁盘 | 每次事务提交刷入磁盘 | 每个1s刷入磁盘+每次事务提交刷入磁盘

relay(中继) log简介:

  • Mysql 主节点将bin log写入本地,从节点定时请求增量binlog,主节点将binlog同步到从节点。
  • 从节点单独进程会将bin log 拷贝至本地 relaylog中。
  • 从节点定时重放relay log。

慢查询日志(slow query log)简介:

  • 慢查询日志简介:
    ①MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
    ②具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上的语句。
    ③由他来查看哪些SQL超出了我们的最大忍耐时间值,比如一条sql执行超过5秒钟,我们就算慢SQL,希望能收集超过5秒的sql,结合之前explain进行全面分析。
  • 慢查询日志说明:
    ①默认情况下,MySQL数据库没有开启慢查询日志,需要我们手动来设置这个参数。
    ②当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件
  • 慢查询日志的关闭与开启是由参数long_query_time控制,默认情况下long_query_time的值为10秒,命令:SHOW VARIABLES LIKE’long_query_time%’;
  • 修改:
    ①当前数据库生效:可以使用命令修改:set global long_query _time=3;
    ②永久生效:可以在my.cnf参数里面修改。
    ③当前会话生效:可以使用命令修改:set long_query _time=3;
  • 注意:
    ①假如运行时间正好等于long_query_time的情况,并不会被记录下来。也就是说在mysql源码里是判断大于long_query_time,而非大于等于。
    ②修改完以后查看修改后的值:
    <1>需要重新连接或者新开一个回话才能看到修改值。 SHOW VARIABLES LIKE ‘long_query_time%’;
    <2>show global variables like ‘long_query_time’;
    ③在配置文件修改时,关于慢查询的参数slow_query_log_file,它指定慢查询日志文件的存放路径,系统默认会给一个缺省的文件host_name-slow.log (如果没有指定参数slow _query log _file的话)
    ④查询当前系统中有多少条慢查询记录:show global status like ‘%Slow_queries%’;

MVCC

脏页(内存页):

  • 当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。
  • 内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。
  • 平时很快的更新操作,都是在写内存和日志,他并不会马上同步到磁盘数据,这时内存数据页跟磁盘数据页内容不一致,我们称之为“脏页”。
  • 一条 SQL 语句,正常执行的时候特别快,偶尔很慢。那这时候可能就是在将脏页同步到磁盘中了

什么时候会引起将脏页同步到磁盘中?

  • 当 redo log写满了。这时候系统就会停止所有的更新操作,将更新的这部分日志对应的脏页同步到磁盘中,此时所有的更新全部停止,此时写的性能变为0,必须待刷一部分脏页后才能更新,这时就会导致 sql语句 执行的很慢。
  • 也可能是系统内存不足时,需要将一部分数据页淘汰掉,如果淘汰的是脏页,则需要先将脏页同步到磁盘,空出来的给别的数据页使用。
  • MySQL 认为系统“空闲”的时候,反正闲着也是闲着反正有机会就同步到磁盘一些数据
  • MySQL 正常关闭。这时候,MySQL 会把内存的脏页都同步到磁盘上,这样下次 MySQL启动的时候,就可以直接从磁盘上读数据,启动速度会很快。

脏页同步到磁盘中会造成的影响:

  • 如果是redo log写满了:尽量要避免的。因为出现这种情况的时候,整个系统就不能再接受更新了,所有的更新都都会停止。此时写的性能变为0,必须待刷一部分脏页后才能更新,这时就会导致 sql语句 执行的很慢
  • 内存不够用了:常态,很正常。

MVCC简介:

  • Multivesion concurrency control(多版本并发控制)
  • 并发访问(读或写)数据库时,对正在事务内处理的数据做多版本的管理。以达到用来避免写操作的阻塞,从而引发读操作的并发问题。
  • 链接:
    ①mysql MVCC
    ②UNDO及MVCC、崩溃恢复
    细节可以去看B站诸葛老师的MVCC详解。

MVCC的几个特点:

  • 每行数据都存在一个版本,每次数据更新时都更新该版本
  • 修改时Copy出当前版本随意修改,各个事务之间无干扰
  • 保存时比较版本号,如果成功(commit),则覆盖原记录;失败则放弃copy(rollback)
  • 也就是每行都有版本号,保存时根据版本号决定是否成功,听起来含有乐观锁的味道;

MYSQL锁机制

Mysql锁机制概述:

  • 简介:
    ①锁是计算机协调多个进程或线程并发访问某一资源的机制。
    ②在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说锁对数据库而言显得尤其重要,也更加复杂。
  • 锁的分类:
    ①从数据操作的类型(读、写)分:
    <1>读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
    <2>写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
    ②从对数据操作的颗粒度:
    <1>表锁
    <2>行锁

表锁(偏读):

  • 特点:偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发最低。
  • MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。MySQL的表级锁有两种模式:
    ①表共享读锁(Table Read Lock)
    ②表独占写锁(Table Write Lock)
锁类型 可否兼容 读锁 写锁
读锁
写锁
  • 结论:
    ①结合上表,所以对MylSAM表进行操作,会有以下情况:
    <1>对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求,只有当读锁释放后,才会执行其它进程的写操作。
    2、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
    ②简而言之,就是读锁会阻塞写,但是不会堵塞读,而写锁则会把读和写都堵塞。
    此外Myisam的读写锁调度是写优先,这也是myisam不适合做写为主表的引擎,因为写锁后其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞。

行锁(偏写):

  • 特点:偏向InnoDB存储引擎,开销大,加锁慢。会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
  • InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION),二是采用了行级锁。
  • 无索引或索引失效时行锁升级为表锁。(因为Innodb引擎是根据索引来实现行锁的,如果不存在索引,那么就不能对此行加record lock,而mysql为了防止错误,只好全部锁定了。)
  • 间隙锁(Gap Lock)简介:
    ①什么是间隙锁:当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加镇,对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”。InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。
    ②危害:
    <1>因为Query执行过程中通过过范围查找的话,他会锁定整个范围内所有的索引键值,即使这个键值并不存在。
    <2>间隙锁有一个比较致命的弱点,就是当锁定一个范围键值之后,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据。在某些场景下这可能会对性能造成很大的危害。
  • 面试题:常考如何锁定一行。
  • 结论:
    ①Innodb存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会要更高一些,但是在整体并发处理能力方面要远远优于MyISAM的表级锁定的,当系统并发量较高的时候,Innodb的整体性能和MyISAM相比就会有比较明显的优势了。
    ②但是Innodb的行级锁定同样也有其脆弱的一面,当我们使用不当的时候,可能会让Innodb的整体性能表现不仅不能比MyISAM高其至可能会更差。
  • 触发机制:innodb的行锁是根据索引触发,如果没有相关的索引,那行锁将会退化成表锁(即锁定整个表里的行)。而锁锁定的是索引即索引树里面的数据库字段的值。
  • 优化建议:
    尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
    ②合理设计索引,尽量缩小锁的范围
    尽可能较少检索条件,避免间隙锁
    ④尽量控制事务大小,减少锁定资源量和时间长度
    ⑤尽可能低级别事务隔离
  • 链接:
    ①mysql 如何触发行锁_MySQL的锁到底有多少内容?
    ②InnoDB的行锁,原来为你做了这么多!

页锁:

  • 简介:
    ①开销和加锁时间界于表锁和行锁之间。
    ②会出现死锁。
    ③锁定粒度界于表锁和行锁之间,并发度一般。

总结:

  • 对于UPDATE、DELETE、INSERT语句,InnoDB会自动将涉及的数据集添加排他锁(X锁)。
  • 事务拿到某一行记录的共享锁(S锁),才可以读取这一行,并阻止其他事务对其添加排他锁。
  • 事务拿到某一行记录的排他锁(X锁),才可以修改或者删除或者新增这一行。
  • 悲观锁的实现方式有两种:共享锁(读锁)和排它锁(写锁)。
  • MVCC是解决了事务之间不可重复读的问题,跟业务用的乐观锁不是同一回事。例如实现库存,不能重复扣减,这时候可以自己实现乐观锁,或者用mysql的 select for update。
  • 链接:
    ①mysql update 会自动加锁吗_MySQL系列之数据库锁
    ②【MySQL笔记】正确的理解MySQL的乐观锁,悲观锁与MVCC
    ③mysql 悲观锁与乐观锁的详解
    ④乐观锁和 MVCC 的区别?
    ⑤MySQL在默认事务下各SQL语句使用的锁分析

主重复制与读写分离

复制的基本原理:

  • 底层主要依靠二进制日志文件(binary log)
  • 复制的基本原则:
    ①每个slave只有一个master
    ②每个slave只能有一个唯一的服务器ID
    ③每个master可以有多个salve
  • 复制最大问题:延时
  • 一主一从常见配置:
    ①mysql版本一致且后台以服务运行
    ②主从都配置在【mysqld】结点下,都是小写
  • 步骤:
    ①主机修改my.ini配置文件
    ②从机修改my.cnf配置文件
    ③主机从机都关闭防火墙
    ④在Windows主机上简历账户并授权slave
    ⑤在Linux从机上配置需要复制的主机
    ⑥主机新建库、新建表、insert记录,从机复制
    ⑦如何停止从服务复制功能:stop slave;

主从复制的作用:

  • 一是确保数据安全;做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据的丢失。
    ①数据分为主表和历史表历史表是容灾备份表
  • 二是提升I/O性能;随着日常生产中业务量越来越大,I/O访问频率越来越高,单机无法满足,此时做多库的存储,有效降低磁盘I/O访问的频率,提高了单个设备的I/O性能。
  • 三是读写分离,使数据库能支持更大的并发;在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。

读写分离:

  • MySQL读写分离是指让master处理写操作,让slave处理读操作,非常适用于读操作量比较大的场景,可减轻master的压力。

  • 使用mysql-proxy实现mysql的读写分离,mysql-proxy实际上是作为后端mysql主从服务器的代理,它直接接受客户端的请求,对SQL语句进行分析,判断出是读操作还是写操作,然后分发至对应的mysql服务器上。

  • mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等

  • MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。

  • 当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数即可。

MySQL架构演进:从主从复制到分库分表:

  • 背景:
    ①业务飞速发展导致数据规模急速膨胀,单机的数据库已经无法满足互联网业务的发展。
    ②传统的将数据集中存储单一数据结节的方案,在容量、性能、可用性和可维护性方面已经难以满足互联网海量数据的场景。
    <1>从容量方面考虑,单机数据库容量有限,难以扩容。
    <2>从性能方面来说,由于关系型数据库大多数采用B+树类型索引,在数据量超过一定的阈值后,索引的深度增加导致对磁盘的随机IO次数增加,进而导致性能问题。
    <3>从可用性方面来说,服务通常设计成无状态的,这必然导致系统的存储压力都集中在数据库层面,而单一的数据节点,或者简单的主从架构,已经越来越难以承担。
    <4>从运维角度来看,当数据都集中在一个节点上时,数据备份和恢复的时间成本也随之数据量上升变得不可控。同时数据丢失导致影响的范围也会被放大。

  • 解决:
    ①主从复制:高可用,读写分离读写分离:提高性能,1主N从,让读不成为系统瓶颈。
    ②分库:垂直方向提高系统性能。
    ③分表:水平方向提高系统性能。
    ④分区:水平方向提高性能。

  • 例子:比如订单表,往往是系统瓶颈,那么可以把订单表专门用一台服务器(分库),采用主从复制,在数据库出错时尽快恢复,设置利用HA机制实时把从变成主。性能还不够,就多搞几个从服务器,读数据从从服务器读取。实现读写分离。要是还不够,可以把奇数用户放一个表,偶数用户放一个表。还可以把3个月前的订单放一个表。或者利用分区功能,按用户id对N取模,放N个分区里。以上方式都是在不改变数据库既有技术↓实现的性能提升,大部分应用都可以通过以上方式在传统数据库下达到性能要求。要是还不行,只能从新找出路了,如nosql,分布式数据库。

  • 链接:
    ①聊聊MySQL架构演进:从主从复制到分库分表
    ②数据库主从复制,读写分离,负载均衡,分库分表分别表达的什么概念?

Mysql分区分表分库

MySQL分区表介绍:

  • 分区是一种表的设计模式,正确的分区可以极大地提升数据库的查询效率,完成更高质量的SQL编程。但是如果错误地使用分区,那么分区可能带来毁灭性的的结果。
  • 分区功能并不是在存储引擎层完成的,因此不只有InnoDB存储引擎支持分区,常见的存储引擎MyISAM、NDB等都支持分区。但是并不是所有的存储引擎都支持,如CSV、FEDORATED、MERGE等就不支持分区。在使用此分区功能前,应该对选择的存储引擎对分区的支持有所了解。
  • MySQL数据库在5.1版本时添加了对分区的支持,分区的过程是将一个表或索引分解为多个更小、更可管理的部分。就访问数据库的应用而言,从逻辑上讲,只有一个表或一个索引,但是在物理上这个表或索引可能由数十个物理分区组成。每个分区都是独立的对象,可以独自处理,也可以作为一个更大对象的一部分进行处理。
  • MySQL数据库支持的分区类型为水平分区(指将同一个表中不同行的记录分配到不同的物理文件中),并不支持垂直分区(指将同一表中不同列的记录分配到不同的物理文件中)。此外,MySQL数据库的分区是局部分区索引,一个分区中既存放了数据又存放了索引。而全局分区是指,数据存放在各个分区中,但是所有数据的索引放在一个对象中。目前,MySQL数据库还不支持全局分区。
  • 可以通过以下命令来查看当前数据库是否启用了分区功能:
show  global  variables  like '%partition%';

MySQL分区类型:

  • RANGE分区:我们介绍的第一种分区类型是RANGE分区,也是最常用的一种分区类型,基于属于一个给定连续区间的列值,把多行分配给分区。
  • LIST分区:LIST分区和RANGE分区类似,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择,而非连续的。
  • HASH分区:HASH分区的目的是将数据均匀地分布到预先定义的各个分区中,保证各分区的数据量大致都是一样的。在RANGE和LIST分区中,必须明确指定一个给定的列值或列值集合应该保存在哪个分区中;而在HASH分区中,MySQL自动完成这些工作,用户所要做的只是基于将要进行哈希分区的列值指定一个列值或表达式,以及指定被分区的表将要被分隔成的分区数量。
  • LINER HASH:MySQL还支持线性哈希功能,它与常规哈希的区别在于,线性哈希功能使用的一个线性的2的幂(powers-of-two)运算法则,而常规哈希使用的是求哈希函数值的模数。
  • KEY分区:KEY分区和HASH分区相似,不同之处在于HASH分区使用用户定义的函数进行分区,支持字符串HASH分区,KEY分区使用MySQL数据库提供的函数进行分区,这些函数基于与PASSWORD()一样的运算法则。
  • COLUMNS:在前面说了RANGE、LIST、HASH和KEY这四种分区中,分区的条件是:数据必须为整形(interger),如果不是整形,那应该需要通过函数将其转化为整形,如YEAR(),TO_DAYS(),MONTH()等函数。MySQL5.5版本开始支持COLUMNS分区,可视为RANGE分区和LIST分区的一种进化。COLUMNS分区可以直接使用非整形的数据进行分区,分区根据类型直接比较而得,不需要转化为整形。此外,RANGE COLUMNS分区可以对多个列的值进行分区。

MYSQL字符集与字符序

字符集、字符序的概念与联系:

  • 链接:读懂MySQL字符集设置
  • 在数据的存储上,MySQL提供了不同的字符集支持。而在数据的对比操作上,则提供了不同的字符序支持。
  • MySQL提供了不同级别的设置,包括server级、database级、table级、column级,可以提供非常精准的设置。
  • 什么是字符集、字符序?简单的来说:
    字符集(character set):定义了字符以及字符的编码。
    字符序(collation):定义了字符的比较规则。
  • 举个例子:
    ①有四个字符:A、B、a、b,这四个字符的编码分别是A = 0, B = 1, a = 2, b = 3。这里的字符 + 编码就构成了字符集(character set)。
    ②如果我们想比较两个字符的大小呢?比如A、B,或者a、b,最直观的比较方式是采用它们的编码,比如因为0 < 1,所以 A < B。
    ③另外,对于A、a,虽然它们编码不同,但我们觉得大小写字符应该是相等的,也就是说 A == a。
    ④这上面定义了两条比较规则,这些比较规则的集合就是collation。
  • 同样是大写字符、小写字符,则比较他们的编码大小; 如果两个字符为大小写关系,则它们相等。

MySQL支持多种字符集与字符序:

  • 一个字符集对应至少一种字符序(一般是1对多)。
  • 两个不同的字符集不能有相同的字符序。
  • 每个字符集都有默认的字符序。
  • 通过SHOW COLLATION进行查看字符序
    可以看到utf8字符集有超过10种字符序。通过Default的值是否为Yes,判断是否默认的字符序。
mysql> SHOW COLLATION WHERE Charset = 'utf8';
+--------------------------+---------+-----+---------+----------+---------+
| Collation                | Charset | Id  | Default | Compiled | Sortlen |
+--------------------------+---------+-----+---------+----------+---------+
| utf8_general_ci          | utf8    |  33 | Yes     | Yes      |       1 |
| utf8_bin                 | utf8    |  83 |         | Yes      |       1 |
...略

server的字符集、字符序:

  • 用途:当你创建数据库,且没有指定字符集、字符序时,server字符集、server字符序就会作为该数据库的默认字符集、排序规则。
  • 如何指定:
    MySQL服务启动时,可通过命令行参数指定。
    也可以通过配置文件的变量指定。
  • server默认字符集、字符序:在MySQL编译的时候,通过编译参数指定。character_set_server、collation_server分别对应server字符集、server字符序。
  • 配置文件指定除了在命令行参数里指定,也可以在配置文件里指定,如下所示:
    mysqld:SQL后台程序(即MySQL服务器)。要想使用客户端程序,该程序必须运行,因为客户端通过连接服务器来访问数据库。
    mysql:交互式输入SQL语句或从文件以批处理模式执行它们的命令行工具。
[client] //客户端请求数据的字符集
default-character-set=utf8[mysql]   //客户端命令行的字符集
default-character-set=utf8[mysqld]  //服务端
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

database的字符集、字符序:

  • 用途:指定数据库级别的字符集、字符序。同一个MySQL服务下的数据库,可以分别指定不同的字符集/字符序。
  • database字符集、字符序是怎么确定的?
    创建数据库时,指定了CHARACTER SET或COLLATE,则以对应的字符集、排序规则为准。
    创建数据库时,如果没有指定字符集、排序规则,则以character_set_server、collation_server为准。

table的字符集、字符序:

  • 创建表、修改表的语法如下,可通过CHARACTER SET、COLLATE设置字符集、字符序。
  • table字符集、字符序如何确定?
    ①假设CHARACTER SET、COLLATE的值分别是charset_name、collation_name。
    ②如果创建table时:明确了charset_name、collation_name,则采用charset_name、collation_name。
    ③只明确了charset_name,但collation_name未明确,则字符集采用charset_name,字符序采用charset_name对应的默认字符序。
    ④只明确了collation_name,但charset_name未明确,则字符序采用collation_name,字符集采用collation_name关联的字符集。
    ⑤charset_name、collation_name均未明确,则采用数据库的字符集、字符序设置。

column的字符集、排序:

  • 类型为CHAR、VARCHAR、TEXT的列,可以指定字符集/字符序,语法如下:
col_name {CHAR | VARCHAR | TEXT} (col_length)[CHARACTER SET charset_name][COLLATE collation_name]
  • column字符集/排序规则确定?
    ①假设CHARACTER SET、COLLATE的值分别是charset_name、collation_name:
    ②如果charset_name、collation_name均明确,则字符集、字符序以charset_name、collation_name为准。
    ③只明确了charset_name,collation_name未明确,则字符集为charset_name,字符序为charset_name的默认字符序。
    ④只明确了collation_name,charset_name未明确,则字符序为collation_name,字符集为collation_name关联的字符集。
    ⑤charset_name、collation_name均未明确,则以table的字符集、字符序为准。

何时设置字符集、字符序?

  • 一般来说,可以在三个地方进行配置:
    创建数据库的时候进行配置。
    mysql server启动的时候进行配置。
    从源码编译mysql的时候,通过编译参数进行配置

数据存储编码:

  • 数据存储的字符编码配置是指定数据库中存储的数据默认采用什么字符编码。
  • 默认字符编码的设置分为四个层次:服务器级、数据库级、数据表级和列级。也就是说,可以为服务器设置一个默认字符编码,再为服务器中的每一个数据库设置不同的默认编码,再为同一个数据库中的每一个数据表设置不同的默认编码,再为同一个数据表中的每一个列设置不同的默认编码。

数据传输编码:

  • 链接:mysql数据传输编码
  • MySQL的客户端可以分为两种:
    一种就是用C语言写的官方客户端——MySQL命令程序;
    一种就是平常程序员使用JDBC等connector API写成的客户端。

Windows客户端:

  • MySQL命令程序在Windows和Linux系统中关于字符编码处理的部分并不等效,下图是Windows系统的客户端字符编码转换逻辑:
  • 其中的三个character变量存在于服务器上,而charset_info存在于客户端。
  • 当客户端启动连接到服务器时,客户端将根据配置参数设置charset_info为指定编码,同时通知服务器让服务器把三个character变量设置为相同编码。
  • 数据传输流程
    ①客户端从控制台标准输入读取一行命令文本,其编码为操作系统编码;
    ②客户端将命令从系统编码转码为客户端charset_info变量设定的编码;
    ③客户端将命令文本发送给服务器;
    ④服务器把收到的文本解码为character_set_client编码,这个编码通常与客户端charset_info一致;
    ⑤服务器把命令文本转码为character_set_connection;
    ⑥服务器执行命令,产生结果;
    ⑦将结果转码为character_set_results发送给客户端;
    ⑧客户端把收到的结果解码为charset_info编码,这个编码通常与character_set_results一致;
    ⑨客户端将结果转码为操作系统编码,输出到控制台标准输出。
  • 由于在Windows平台上MySQL程序在读取控制台时使用了Unicode Console Read API,所以程序从控制台获取的原始字符串实际上是UTF16编码,所以这里的“操作系统编码”并不是Windows通常的GBK,而应该看做UTF16。

总结:

字符集 作用
character_set_client(服务器传输): 客户端请求数据的字符集
character_set_connection(服务器传输): 客户机/服务器连接的字符集
character_set_database(存储): 默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。
character_set_filesystem(控制台展示): 把os上文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的
character_set_results(服务器传输): 结果集,返回给客户端的字符集
character_set_serve(存储)r: 数据库服务器的默认字符集
character_set_system(客户端传输): 系统字符集,这个值总是utf8,不需要设置。这个字符集用于数据库对象(如表和列)的名字,也用于存储在目录表中的函数的名字。

注意:

  • JDBC中连接数据库时,用useUnicode=true&characterEncoding=utf8,若未指定useUnicode=true,那么采用的字符集是什么?
  • 首先useUnicode=true是默认值,其次如果指定useUnicode=false,那么就会使用服务端变量character-set-server所指定的值。

Mysql的UTF-8:

  • MySQL的“utf8”实际上不是真正的UTF-8。
    ①“utf8”只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节。
    ②MySQL一直没有修复这个bug,他们在2010年发布了一个叫作“utf8mb4”的字符集,绕过了这个问题。
    ③当然,他们并没有对新的字符集广而告之(可能是因为这个bug让他们觉得很尴尬),以致于现在网络上仍然在建议开发者使用“utf8”,但这些建议都是错误的。
  • 简单概括如下:
    ①MySQL的“utf8mb4”是真正的“UTF-8”。
    ②MySQL的“utf8”是一种“专属的编码”,它能够编码的Unicode字符并不多。
    ③我要在这里澄清一下:所有在使用“utf8”的MySQL和MariaDB用户都应该改用“utf8mb4”,永远都不要再使用“utf8”。
  • 链接:记住:永远不要在MySQL中使用UTF-8

MYSQL高级其他

mysql-server与mysql-client与实例与数据库的联系

  • mysql-server 与mysql-client是DBMS的两个面向不同操作对象的工具。server是DBMS面向物理层次,包含存储数据的一系列机制、处理方法的集成;client是DBMS面向用户,提供一系列工具为用户所用,这些工具包括通常写的sql在内都要通过server的编译才能操作物理数据。
    客户–client–server物理数据。服务器–mysql-server是服务端。
    ①前者是mysql核心程序,生成管理数据库实例,数据库实例任务调度线程之类,并提供相关接口供不同客户端调用。
    ②后者是操作数据库实例的工具操作mysql实例的客户端有很多,mysql-client只是其中一种,包括mysql,mysqldump,mysqlslap,这些访问,备份,压力测试的工具mysql-server是服务端。
  • MySQL实例是线程和内存组成,实例才是真正用于操作数据库文件的(MySQL数据库是由一些列物理文件组成,类似于frm、MYD、MYI、ibd结尾的文件)。

  • 注意:
    ①MySQL安装包可能包括上述两者。
    <1>如果您只需要连接到远程服务器并运行查询,只需安装mysql客户端。
    <2>如果需要托管数据库,请安装客户端和服务器。
    ②mysql-clinet可以使用命令行也可以使用数据库管理工具执行(底层仍然是命令行)

  • 本质上的区别是:
    ①server是执行一个crud操作,client是发送一个crud操作。
    ②server是把sql语句翻译成对内存和文件的操作,也就是说,server是直接操作文件的。而client是对数据库/表进行操作,不是直接对文件进行操作。

  • 总结:
    mysql客户端访问mysql服务端操作数据库。
    mysql服务端是一个总的名称,意思是mysql服务端也可以称为mysql实例。
    mysql服务端可以有多个实例。
    myql数据库就是物理文件。

  • 链接:MySQL中的实例、数据库关系简介

保障MySQL安全的最佳方法简介:

  • 避免从互联网访问MySQL数据库,确保特定主机才拥有访问特权
  • 定期备份数据库
  • 禁用或限制远程访问
  • 设置root用户的口令并改变其登录名
  • 移除测试(test)数据库
  • 禁用LOCAL INFILE
  • 移除匿名账户和废弃的账户
  • 降低系统特权
  • 降低用户的数据库特权
  • 移除和禁用.mysql_history文件
  • 安全补丁
  • 启用日志
  • 改变root目录
  • 禁用LOCAL INFILE命令
  • 链接:保障MySQL安全的14个最佳方法

三大范式概念:

  • 范式概念:
    ①设计数据库的时候需要遵从的一些规范,目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
    ②当然正常情况下我们满足前三个范式就可以设计一个比较规范的数据库。
    ③要遵循后边的范式,就必须先遵循前面的范式要求,比如第二范式就必须先遵循第一范式的,第三范式必须先遵循第二范式,以此类推。
  • 三大范式概念:
    ①第一范式(1NF):每个列都不可以再拆分。
    ②第二范式(2NF):在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
    ③第三范式(3NF):在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
  • 链接:MySQL三大范式详解

Mysql权限介绍:

  • mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表。
  • mysql权限表的验证过程为:
    ①先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。
    ②通过身份认证后,进行权限分配,按照user,db,tables_priv,columns_priv的顺序进行验证。即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
  • Mysql有哪些权限:
  • 链接:mysql 5.7中的用户权限分配相关解读!

批量数据脚本:

日志分析工具mysqldumpshow:

  • 查看mysqldumpshow的帮助信息:
  • 工作常用参考:

Mysql命令以及内置变量

mysql 查看信息的命令(show\desc\explain):

  • desc命令:
    查看表的信息 1、desc t_your_table; 2、(用show的话)show columns from t_your_table;
  • show命令:
    ①查看配置 show variable;
    ②查看目前处理的列表 show processlist;
    ③看看有哪些存储过程 show procedure status;
    ④查看表的创建 show create table t_your_table;
    ⑤查看存储过程的创建 show create procedure p_your_procedure
    ⑥索引show index from t_your_table;
    ⑦主服务器show master status;
    ⑧从服务器show slave status;
    ⑨查看日志show binary logs;
    ⑩查看状态show status;
    ⑪查看user权限show grant for u_user_name
    ⑫查看服务器支持的权限show privileges;
    ⑬查看所有支持的字符集show character set;
  • explain命令:
    ①查看一条命令的执行方案explain select * fromt t_your_tabe;
    ②如果是分区表explain partitions select * from t_your_table;

SQL的常见命令:

  • show databases; 查看所有的数据库
  • use 库名; 打开指定 的库
  • show tables ; 显示库中的所有表
  • show tables from 库名;显示指定库中的所有表
  • create table 表名(
    字段名 字段类型,
    字段名 字段类型
    ); 创建表
  • desc 表名; 查看指定表的结构
  • select * from 表名;显示表中的所有数据

查看 MySQL 数据库中每个表占用的空间大小:

  • 如果想知道MySQL数据库中每个表占用的空间、表记录的行数的话,可以打开MySQL的 information_schema数据库。在该库中有一个 TABLES 表,这个表主要字段分别是:
    ①TABLE_SCHEMA : 数据库名(SCHEMA:纲要)
    ②TABLE_NAME:表名
    ③ENGINE:所使用的存储引擎
    ④TABLES_ROWS:记录数
    ⑤DATA_LENGTH:数据大小
    ⑥INDEX_LENGTH:索引大小
  • 查询所有数据库的大小 :
1:use information_schema;
select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables; 2:select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where
table_schema='database_name';
  • 查询指定表的大小
select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where
table_schema='database_name' and table_name='table_name';
  • 链接:查看 MySQL数据库中每个表占用的空间大小

MySQL 删除数据后释放磁盘空间:

  • drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ;
  • truncate table table_name立刻释放磁盘空间 ,不管是 Innodb和MyISAM;
  • delete from table_name 删除表的全部数据,对于MyISAM 会立刻释放磁盘空间 ,而InnoDB 不会释放磁盘空间;
  • delete from table_name where xx 带条件的删除, 不管是innodb还是MyISAM都不会释放磁盘空间;
  • delete操作后使用optimize table table_name 释放磁盘空间,优化表期间会锁定表,所以要在空闲时段执行optimize table ,测试十几个G数据的表执行optimize table 大概20多分钟。
    ①注:delete删除数据的时候,mysql并没有把数据文件删除,而是将数据文件的标识位删除,没有整理文件,因此不会彻底释放空间。被删除的数据将会被保存在一个链接清单中,当有新数据写入的时候,mysql会利用这些已删除的空间再写入。即,删除操作会带来一些数据碎片,正是这些碎片在占用硬盘空间。
    ②OPTIMIZE TABLE命令优化表,该命令会重新利用未使用的空间,并整理数据文件的碎片;该命令将会整理表数据和相关的索引数据的物理存储空间,用来减少占用的磁盘空间,并提高访问表时候的IO性能;但是具体对表产生的影响是依赖于表使用的存储引擎的。该命令对视图无效。
  • 链接:
    ①MySQL删除数据后释放磁盘空间
    ②关于mysql 删除数据后物理空间未释放

mysql数据库缓存:

  • MySQL InnoDB buffer pool 里包含什么?
    ①数据缓存:InnoDB数据页面
    ②索引缓存:索引数据
    ③缓冲数据:脏页(在内存中修改尚未刷新(写入)到磁盘的数据)
    ④内部结构:如自适应哈希索引,行锁等。
  • innodb_buffer_pool_size默认大小为128M。
  • InnoDB表执行大批量数据的更新,插入,删除操作时会出现这个问题(The total number of locks exceeds the lock table size错误),需要调整InnoDB全局的innodb_buffer_pool_size的值来解决。
  • 命令:
    ①查看:show variables like “%_buffer%”;
    ②设置:SET GLOBAL innodb_buffer_pool_size=1073741824;

数据库链接泄露与链接太多:

  • 每个mysql版本的最大连接数都不一样。
  • 修改最大连接数:
方法一:
1、show variables like '%max_connections%'; 查看最大连接数
2、set global max_connections=1000 重新设置方法二:
1、修改mysql的主配置文件/etc/my.cnf
[mysqld]部分添加
“max_connections=1000(这个根据实际的需要来进行设置即可)”,
2、重启MySQL服务
  • 查看连接数信息
mysql> show status like 'Threads%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 58    |
| Threads_connected | 57    |   ###这个数值指的是打开的连接数
| Threads_created   | 3676  |
| Threads_running   | 4     |   ###这个数值指的是激活的连接数,这个数值一般远低于connected数值
+-------------------+-------+
  • 链接泄露:查看建立的逻辑连接数和关闭的逻辑连接数,关键的指标在这里,如果连接池的开启和关闭是正常的,那么二者的值应该是相等的。
  • 链接:MySQL中经典的too many connection怎么破

Mysql高级知识概括相关推荐

  1. Mysql索引知识概括

    Mysql索引知识概括 索引由来 索引简介 索引分类 索引分析 索引延伸 执行计划与资源消耗 索引由来 性能下降SQL慢 .执行时间长 .等待时间长: 查询语句写的烂 索引失效 关联查询太多join( ...

  2. MySQL高级知识(十五)——主从复制

    前言:本章主要讲解MySQL主从复制的操作步骤.由于环境限制,主机使用Windows环境,从机使用用Linux环境.另外MySQL的版本最好一致,笔者采用的MySQL5.7.22版本,具体安装过程请查 ...

  3. MySQL高级知识(十六)——小表驱动大表

    前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里.在查询的优化中永远小表驱动大表. 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5 ...

  4. MySQL高级知识(十一)——Show Profile

    前言:Show Profile是mysql提供的可以用来分析当前会话中sql语句执行的资源消耗情况的工具,可用于sql调优的测量.默认情况下处于关闭状态,并保存最近15次的运行结果. 1.分析步骤 # ...

  5. MySQL高级知识(一)——基础

    MySQL高级知识(一)--基础 前言:MySQL高级知识 1.关于MySQL的一些文件 MySQL如何安装.如何配置自启动,这里不进行讲述,可自行搜索相关安装教程进行处理.这里主要介绍MySQL的主 ...

  6. MySQL高级知识(三)——索引

    前言:索引在sql调优部分占据着重要的位置,了解并深入索引对我们来说也是非常重要的.本篇主要介绍MySQL中索引的相关知识点. 1.索引是什么 MySQL官方对索引的定义:索引(Index)是帮助My ...

  7. mysql高级知识(linux安装mysql+索引+视图+存储过程和函数+触发器)

    一.linux系统安装Mysql 1.mysql安装包: MySQL :: Download MySQL Community Server 2.mysql安装 linux安装在vmware(虚拟机)上 ...

  8. MySQL高级知识(十四)——行锁

    前言:前面学习了表锁的相关知识,本篇主要介绍行锁的相关知识.行锁偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突的概率低,但并发度高. 0.准备 #1.创建相关测试表tb_ ...

  9. MySQL高级知识(十二)——全局查询日志

    前言:全局查询日志用于保存所有的sql执行记录,该功能主要用于测试环境,在生产环境中永远不要开启该功能. 1.如何开启 #1.通过my.cnf配置开启该功能. 注:对my.cnf文件配置后,需重启my ...

最新文章

  1. android studio 插件版本号和gradle版本号对应关系
  2. (转载)详解Hive配置Kerberos认证
  3. Linux Shell实例精讲学习笔记
  4. 可视化mysql怎么导入sql文件_使用navicat导入sql文件的方法步骤
  5. vue打包路径.html问题,如何解决vue.js打包报错问题
  6. Redis随笔Jedis、jedisCluster的使用
  7. 剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)
  8. 拖动窗体FormBorderStyle属性为None的窗体移动
  9. 小米实现隔空充电技术;程序员离职小技巧;GitLab 涨价|开发者周刊
  10. python 基础课程第二天
  11. python中变量怎么使用_python中变量怎么使用
  12. 激活函数- relu vs sigmoid
  13. vim配置:高亮所在的行和列
  14. 程序员教你如何用python制作一个牛逼的脚本
  15. Visual Studio 2015安装配置图文教程
  16. VirtualBox创建Linux虚拟机图文教程
  17. Traitors Eight 硅谷“八叛徒”
  18. 计算机怎么剪切音乐然后合在一起,mp3剪切合并大师2019(解决如何将两个mp3合并)V12.7 电脑版...
  19. 【精简操作】Mathtype安装出现错误“53”/未找到.wll文件/选项卡灰色等问题
  20. Excel筛选两列重复的内容

热门文章

  1. luogu P4899 [IOI2018] werewolf 狼火
  2. 开学季,乐高LEGO用AI,给这群特殊儿童做了件善事
  3. 网站架构之用户的自留地,个人空间及其管理后台的架构。
  4. Android app如何使用 有效运动传感器
  5. mysql删除表里面姓王的人_MySQL 删除数据表_mysql删除数据表命令_DROP TABLE table_name...
  6. Modbus 协议与 ESP-Modbus-DTU 工业物联网方案介绍
  7. 一天掌握Android JNI开发
  8. numpy.数组维度
  9. 转 CSDN积分获取
  10. 服务器的验证码重要么,短信验证码是什么?为什么要用短信验证码?