高性能MySQL 第4版

news2024/9/28 23:27:31

第一章MySQL架构

MySQL提供了多种锁的颗粒度,每种MySQL存储引擎都可以实现自己的锁策略和锁力度。

行级锁是在存储引擎而不是在服务器中实现的。

隔离界别

READ UNCOMMITTED - 脏读

在事务中可以可以查看到其他事务中还没有提交的修改。实际中很少用。

READ COMMITTED - 提交读

同一事务中两次执行相同语句,可能会看到不同的数据结果。

REPEATABLE READ - 可重复读

MySQL的默认隔离级别。

serializable - 可串行化

最高的隔离级别。强制事务按顺序执行。实际中很少用到。

死锁

InnoDB如果检测到循环依赖(死锁),会立刻返回一个错误信息。

InnoDB目前处理死锁的方式是将持有最少行级排他所的事务回滚。

事务

在同一个事务中,混合多种存储引擎是不可靠的。

第二章

MySQL中有一个Threads running状态计数器可以作为可用性问题的关键指标,这个计数器跟踪的是给定数据库主机上当前正在运行的查询数量。

如果Threads running超过了CPU核数,则可能表明服务器整处于不稳定状态。

thread_connected/max_connections的比值显示了应用程序节点数量的增长与数据库允许的最大连接池有多接近。

第三章 Performance Schema

Performance Schema介绍

Performance Schema同了有关MySQL服务器内部运行的操作上的底层指标。

Performance Schema有两个概念:

程序插桩:程序插桩在MySQL代码中插入探测代码,以获取我么你想了解的信息。

消费者表:指存储关于程序插桩代码信息的表。如果我们为查询模块添加插桩,相应的消费者表将记录诸如执行总数、未使用索引的次数、花费的时间等信息。消费者表是插桩发送信息的目的地。

第四章 操作系统和硬件优化

MySQL需要的四种基本资源是:CPU、内存、磁盘、网络资源。

MySQL为了加快IO,许多事务系统使用提前写日志的策略。提前写日志允许在内存中更改页面,而不用将更改刷新到硬盘上。

写入放大用来描述由于部分块写而导致的数据从一处移动到另一处、多次写入数据和元数据所产生的额外操作。

当设备被填满时,垃圾收集器必须更努力的保持某些块的清洁,因此写放大因子会增加。因此,许多设备在空间块满时会变慢。

raid控制器的内存是一种稀缺资源,应该明智的使用它。将其用于读操作通常是一种浪费,将其用于写操作时提高IO性能的一种重要方式。

建议生产环境启用:skip_name_resolve 解决dns问题。

MySQL的文件系统建议选择ext4、XFS或ZFS。

某些特殊情况,OOM Killer进程将启动并终止某些进程,例如终止SSH进程,为了防止这种情况,需要更改SSH进程的oom_adj或oom_score_adj。

查看操作系统状态一般用:iostat 或 vmstat

第五章 优化服务器设置

MySQL有很多可以更改但是不需要更改的设置。通过建议正确的配置基本设置(在大多数情况下,只有少数设置是重要的),并将更多的时间花在schema优化、索引和查询设计上。

首先应该确保InnoDB缓冲池和日志文件大小等基本设置是合适的。

如果非要改进配置,应该在查询响应时间中体现出来。最好从查询及响应时间开始分析,而不是从配置选项开始。

配置文件位置通常是:/etc/my.cnf或/etc/mysql/my.cnf

需要永久使用的任何设置都应该写入到全局配置文件,而不是在命令行中指定。

如果不知道服务器会读取哪些配置文件,可以通过以下命令查询:

服务器一般读取mysqld部分。

配置文件中,配置设置全部用小写字母书写,单词之间可以用下划线或中横线分隔。

如果在服务器运行时设置变量的全局值,则当前回话与其他现有会话的值将不受影响。如果客户端依赖数据库长连接,请务必记住这一点。在每次更改后应该检查SHOW GLOBAL VARIABLES的输出,以确保达到预期效果。

可以用SET命令为变量设置一个特殊值DEFAULT。将会话作用域变量设置成DEFAULT会将该变量设置为相应的全局作用域变量的值。

8.0新语法;SET PRESIST允许在运行时设置一次值,MySQL将把这个设置写入磁盘,在下次重启后继续使用该值。

请注意:在默认情况下,只更改配置文件,实际上不会做任何事情,还必须更改运行时设置。

缓存命中率和缓存大小无关。

尽量避免使用大型临时表或复杂的存储过程。

操作系统有足够内存的最佳判断依据是:它没有主动将虚拟内存交换(分页)到磁盘。

InnoDB的配置

最重要的选项是:innodb_log_file_size和innodb_buffer_pool_size

日志配置:innodb_log_file_size、innodb_log_file_in_group,建议使用innodb_dedicated_server,日志文件的大小会根据系统内存来自动管理。

如何刷新日志到缓冲区:innodb_flash_log_at_trx_commit来控制日志以缓冲区的刷新位置和刷新频率。把它设置成 1 ,是最安全的。

InnoDB表空间

使用innodb_data_home_dir和innodb_data_file_path 配置指定表空间文件。

建议使用innodb_file_per_table并限制共享表空间的大小。

MySQL并发

将innodb_thread_concurrency设置为与可用CPU核数相同的值,然后根据需要调整大小。

MySQL安全设置

max_connect_error

max_connections:可以设置的足够高。 同时可以关注max_used_connections。

skip_name_resolve:强烈建议设置此选项

read_only和super_read_only:强烈建议启用。super_read_only会防止意外地使用管理员账户将数据写入只读副本,从而引起数据不同步。

第六章 schema设计与管理

整数类型:int(11)对大多数应用毫无意义,它不会限制值的合法范围。它只是规定了MySQL的一些交互工具用来显示字符的个数。

实数类型:我们建议只指定数据类型,不指定精度。MySQL会使用double进行浮点类型的内部计算。

字符串类型:CHAR在存储时,MySQL会删除所有尾随空格。如果需要进行比较,值会用空格填充。字符串长度定义的是字符数,不是字节数。

BIT:MySQL会在处理时将BIT视为字符串类型,而不是数字类型。不建议使用BIT类型。

SET:FIND_IN_SER() 、FIELD()

太多联接的查询会很慢,每个查询最好少于十几个的表。

小心使用ENUM和SET。

第七章 创建高性能的索引

索引基础

如果索引包含很多列,那么列的顺序也很重要。MySQL智能有效的使用索引的最左前缀列。

b-tree索引的限制:

  • 如果不是按照索引的最左列开始查找,则无法使用索引。
  • 不能跳过索引中的列。
  • 如果查询中有某列的范围查询,则其右边所有列都无法使用索引优化查找。

对于BLOB、TEXT、很长的VARCHAR类型的列,必须使用前缀索引。

创建前缀索引的语句:

ALTER TABLE city_demo ADD KEY (city(7));

通常使用UNION改写查询,往往是最好的办法。

使用索引排序

只有当索引的顺序和order by子句的顺序完全一致,并且所有列的排序方向都一样时,MySQL才能使用索引才对结果做排序。

如果查询需要联接多张表,则只有当order by子句引用的字段全部在一个表时,才能使用索引做排序。

order by子句和查找型查询的限制是一样的:需要满足索引的最左前缀的要求,否则,MySQL需要执行排序操作,而无法利用索引排序。

有种特殊情况,如果前导列是常量的时候,order by子句中的列也可以不满足索引的最左前缀的要求。

修复损坏的表

CHECK TABLE通常能找出大多数的表和索引的错误。

也可以使用REPAIR TABLE命令来修复损坏的表,但是同样不是所有的存储引擎都支持该命令。

更改表的存储引擎: ALTER TABLE<table> ENGINE=INNODB;

更新索引统计信息

其目的是使存储引擎向优化器提供正确的表信息,以防止优化器做出错误的判断。

语句:SHOW INDEX,只要SHOW INDEX查看表索引统计信息,就会出发统计信息的更新。

减少索引的碎片

语句:OPTIMIZE TABLE

注意:单行访问时最慢的。同时,我们建议按响应时间来对查询进行分析。找出那些消耗最长时间的查询或者那些给服务器带来最大压力的查询。

第八章 查询性能优化

MySQL是否在扫描额外的记录

衡量MySQL查询开销的三个指标:

  • 响应时间
  • 扫描的行数
  • 返回的行数

EXPLAIN语句中的type列反应了访问类型。

查询请求的流程

当向MySQL发送一个请求的时候,MySQL到底做了什么?

  • 客户端你给服务器发送一条sql语句;
  • 服务器进行sql语句解析、预处理,再由优化器生成对应的执行计划;
  • MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询;
  • 将结果返给客户端。

查询优化器

优化策略有2中:静态优化和动态优化。

并行执行

MySQL无法利用多核特性来并行执行查询。

在同一个表中查询和更新

MySQL不允许对一张表同时进行查询和更新。

count()

count()有两种作用:它可以统计某列的值的数量,也可以统计行数。

在统计列值时,要求列值时非空的(不统计NULL)。如果在count()的括号中指定了列或列的表达式,则统计的就是这个表达式有值的结果数。

在统计结果集的行数时,当MySQL确认括号内的表达式不可能为空时,实际上就是在统计行数。最简单的就是当我们使用count(*)时,这种情况通配符*并不会向我们猜想的那样扩展成所有列,实际上它会忽略所有列而直接统计所有的行数。

如果想要知道结果集中的行数,应该使用count(*)。

优化联接查询

除非有其他理由,否则只需要再联接顺序中的第二个表的响应列上创建索引。例如A表和B表通过C列联接查询时,如果优化器的联接顺序是B、A,则不需要再B表的对应列上建索引。

优化limit

select id,desc from film order by title limit 50,5

如果该表很大,那么可以改成下面的样子:

select id,desc from film

inner join

(select id,desc from film order by title limit 50,5) as lim

using(id);

优化offset

select id,desc from film where id < 16030  order by title desc limit 20;

第九章 复制

MySQL提供了三种不同的二进制日志格式用于复制,建议使用基于行的复制。

强烈建议启用GTID全局事务标识符。

第十章 备份与恢复

在生产实践中,对于大数据库来说,裸文件备份是必须的。对于较小的数据库,逻辑备份可以很好的胜任。

保存二进制日志用于基于故障时间点的恢复,应该将expire_logs_days参数的值设置的足够大。

差异备份:是对自上次全备份后所有更改的部分而多的备份。

增量备份:是对自任意类型的上次备份后的所有修改做的备份。

裸文件恢复用:PerconaXtraBackup

逻辑备份恢复用:mydumper

第十一章 扩展MySQL

第十二章 云端MySQL

选择正确的机器类型

vCPU数量的计算公式:(物理机CPU核的数量 X 95%CPU总使用量) X 2

建议将50%作为常规的使用率目标,最高可达65%-70%。如果维持在70%或更高的CPU使用率,将可能看到延迟增加,此时应该考虑增加更多CPU。

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

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

相关文章

(C语言)qsort函数模拟实现

前言 我们需先了解qsort函数 qsort函数详解&#xff1a;http://t.csdnimg.cn/rTNv9 qsort函数可以排序多种数据类型&#xff0c;很是神奇&#xff0c;这是为什么&#xff0c;我们在里模拟实现这样的功能 目录 1. qsort函数模拟实现 2. 我们使用bubble_sort函数排序整形数…

微星H510M PLUS V3主板安装纯Ubuntu系统安装或启动界面黑屏问题

Ubuntu系统安装或启动界面黑屏问题 1 前言2 原因分析3 解决方法3.1 安装界面黑屏3.2 启动界面黑屏3.3 安装显卡驱动 1 前言 我自己组装了一台台式机&#xff0c;配置如下&#xff1a; 主板&#xff1a;微星H510M PLUS V3显卡&#xff1a;英伟达RTX 2060内存&#xff1a;金百达…

文件的顺序读写函数举例介绍

目录 例1&#xff1a;&#xff08;使用字符输出函数fputc&#xff09;例2&#xff1a;&#xff08;使用字符输入函数fgetc&#xff09;例3&#xff1a;&#xff08;使用文本行输出函数fputs &#xff09;例4&#xff1a;&#xff08;使用文本行输入函数fgets &#xff09;例5&a…

微信小程序屏蔽控制台黄色提示信息

我们很多时候 一个小程序 啥都没有 终端就一直报一些黄色的警告 可以打开项目的 project.config.json 找一下setting 下面有没有 checkSiteMap 字段 如果没有加一个 如果有 直接将值改为 false 这样 再运行 就不会有这个黄色的提示信息了

牛客网C++专项题目整理(1)

1. 若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是 1.p s; 2.p k; 3.p s[0]; 4.k s; 答案&#xff1a;124 char s[3][10] s 是数组指针&#xff0c;类型为char (*)[3]&#xff0c;所指向的每个数组长度为10; char (*k)[3] k是一个数组指针&a…

Windows下用crashRpt让C++程序崩溃自动生成dump

背景 我们的Windows c程序如果在客户或者没有代码调试的环境下崩溃了。我们只能从机器异常报错里得知寥寥无几的信息&#xff0c;如果程序崩溃时&#xff0c;能自动触发当前堆栈信息的收集&#xff0c;那么对于开发人员复现BUG就尤为重要 CrashRpt CrashRpt主要功能 1.崩溃报…

【Java基础系列】时间戳

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

政安晨【示例演绎虚拟世界开发】(五):从制作一个对战小游戏开始(Cocos Creator 《击败老大》)(第二段)

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: AI虚拟世界大讲堂 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 现在我们已经学会了如何向场景中添加图片&#xff0c;接下来继…

Django路由层(反向解析、路由分发、命名空间、路径转换)

Django路由层&#xff08;反向解析、路由分发、命名空间、路径转换&#xff09; 目录 Django路由层&#xff08;反向解析、路由分发、命名空间、路径转换&#xff09;路由配置反向解析前端用法后端用法 反向解析的本质路由分发用法示例 分发时遇到的问题解决方案1解决方案2 命名…

过于老旧的pytorch_ssim包 请从github下载源码

有些冷门算法真的不要随便pip&#xff0c;有可能下载到史前版本…最好还是找源代码 汗 今天要用到SSIM损失函数&#xff0c;从网上简单看了一下原理就想测试一下&#xff0c;偷了一下懒就直接在命令行输入pip install pytorch_ssim了&#xff0c;结果报了一堆错误&#xff08;汗…

vue3编写H5适配横竖屏

具体思路如下&#xff1a; 1、监听浏览器屏幕变化&#xff0c;通过监听屏幕宽高&#xff0c;辨别出是横屏&#xff0c;还是竖屏状态 在项目的起始根页面进行监听&#xff0c;我就是在App.vue文件下进行监听 代码如下&#xff1a; <template><RouterView /> <…

【MySQL】:约束全解析

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. 约束概述二. 约束演示三. 外键约束3.1 介绍3.2 语法3.3 删除/更新行为 &…

Ribbon负载均衡(黑马学习笔记)

上Eureka一节中&#xff0c;我们添加了LoadBalanced注解&#xff0c;即可实现负载均衡功能&#xff0c;这是什么原理呢&#xff1f; 负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。 那么我们发出的请求明明是http://users…

文献阅读:The Unreasonable Effectiveness of Easy Training Data for Hard Tasks

文献阅读&#xff1a;The Unreasonable Effectiveness of Easy Training Data for Hard Tasks 1. 文章简介2. 方法介绍 1. 数据集难易度分析2. 模型训练前后变化 3. 实验考察 & 结论 1. 实验设计 1. 使用数据集2. 使用模型 2. 实验结果 1. 数据集难度分析2. 在Easy数据集下…

迭代器模式:分离遍历逻辑与数据结构,实现统一访问接口与灵活扩展

文章目录 一、引言二、应用场景与技术背景三、模式定义与实现四、优缺点分析总结&#xff1a; 一、引言 ​ 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供了一种方法顺序访问聚合对象的元素&#xff0c;而又不暴露其底层表示。迭…

SaaS 电商设计 (九) 动态化且易扩展的实现购物车底部弹层(附:一套普适的线上功能切量的发布方案)

目录 一.背景1.1 业务背景1.2 技术负债 二.技术目标三.方案设计3.1 解决移动端频繁发版3.1.1 场景分析3.1.2 技术方案 3.2 减少后端坏味道代码&无法灵活扩展问题3.2.1 通过抽象接口完成各自单独楼层渲染逻辑3.2.2 通过配置能力做到部分字段可配 四.升级上线(普适于高并发大…

NoSQL--2.MongoDB配置

目录 2.MongdoDB配置 2.1 Windows环境下操作 2.1.1 注册MongDB Atlas&#xff1a; 2.1.2 MongoDB Community Server Download&#xff1a; 2.1.3 启动MondgoDB服务&#xff1a; 2.1.3.1 命令行参数的方式启动MongoDB服务&#xff1a; 2.1.3.2 使用配置文件方式启动Mongo…

Python算法100例-3.4 完数

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展 1&#xff0e;问题描述 求某一范围内完数的个数。 如果一个数等于它的因子之和&#xff0c;则称该数为“完数”&#xff08;或“完全数”&…

C#中多语言编程原理及实例解析

文章目录 一、了解C#多语言编程原理1. 通用语言运行库&#xff08;CLR&#xff09;2. 通用类型系统&#xff08;CTS&#xff09;3. 微软中间语言&#xff08;MSIL&#xff09;4. 元数据和反射5. 公共语言规范&#xff08;CLS&#xff09; 二、实例说明 一、了解C#多语言编程原理…

Linux笔记--用户与用户组

Linux系统是一个多用户多任务的操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员(root)申请一个账号&#xff0c;然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪&#xff0c;并控制他们对系…