开发人员MySQL调优-理论篇

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

修改字符集

查看字符集

show variables like 'character%'
show variables like '%char%'

上面的两个命令都可以,我一般使用的下面的,会出来如下几个字符集设定的选项:

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_server:数据库服务器的默认字符集character_set_system:这个值总是utf8,不需要设置,是为存储系统元数据的字符集

修改配置文件

​ 修改/etc/my.cnf配置文件

在client下做如下一个选项的修改

[client]
default-character-set=utf8
[mysqld]
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci
lower_case_table_names=1
max_connections=1000
[mysql]
default-character-set=utf8

配置文件

目前整个配置文件内容

[client]
default-character-set=utf8
[mysqld]
server-id=1
log-bin=mysql-bin
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
​
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci
​
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
​
[mysql]
default-character-set=utf8

 

log-bin

​ 定义主从复制文件前缀,后面生成的文件在datadir+logbin-filename

如:

​ 里面不仅有log-bin文件,还有创建的数据库对应的目录等

log-error

​ MySql的一些重要的数据信息都会在里面,日常运维监控都需要打开看看,例如将执行时间超过1秒的SQL输出

datadir

  • frm文件-相当于表的元数据

  • myd文件-表的数据文件

  • myi文件-表的索引文件

SQL性能下降原因

可能问题

1.查询语句写的烂

​ SQL关联的表很多,条件很复杂,很多子查询等,导致生成的执行计划有问题而无法生成索引

2.索引失效

​ 单值索引:索引建立在单列上

​ 组合索引:索引建立在多个字段上,如果查询的条件经常出现多列的同一个组合,那么创建组合索引非常高效

3.关联查询太多

​ 现在硬件设备都已经起来的,数据库表设计几乎都不在严格遵循三范式,增加冗余,提高查询速度,以空间换时间。不过这样设计也有一些毛病,在做update的时候就必须修改更多的地方,否则会导致数据一致性问题

​ 在分布式数据库中,如果跨主机关联太多,会导致大量的网络通信,极大的增加了SQL执行时长

​ 如果确实不得不关联很多表,建议将一个大SQL拆分成小SQL,增强SQL执行计划的稳定性

4.服务器调优

​ 修改排序缓冲和数据缓冲大小,修改线程数大小

关联查询

SQL读取执行顺序

SELECT distinct column_list 
​FROM taba 
​JOIN tabb ON join_condition 
​WHERE where-condition 
​GROUP BY group-by-list 
​HAVING having-condition 
​ORDER BY order-by-condition 
​LIMIT limit-number

 

Mysql读取顺序

2225b65e8a07eff7f3150b2aa48bb2de776.jpg

9d0229ed544f60fa2046a29798e38e72cd9.jpg

先求关联表的笛卡尔积——》得到主表结果数据——》做join,不符合on的数据也补充到结果中——》做条件过滤——》分组——》分组过滤——》结果集列筛选——》排序——》限定返回结果集

7中JOIN写法

74e4d38dce40d3a69dc416c062d839e4b95.jpg

1.INNER JOIN 内连接

​ SELECT <select_list>

​ FROM taba a

​ INNER JOIN tabb b

​ ON a.key = b.key

2.LEFT JOIN 左外连接

​ SELECT <select_list>

​ FROM taba a

​ LEFT JOIN tabb b

​ ON a.key = b.key

3.RIGHT JOIN 右外连接

​ SELECT <select_list>

​ FROM taba a

​ RIGHT JOIN tabb b

​ ON a.key = b.key

4.LEFT JOIN 求差

​ SELECT <select_list>

​ FROM taba a

​ LEFT JOIN tabb b

​ ON a.key = b.key

​ WHERE b.key is NULL

5.RIGHT JOIN 求差

​ SELECT <select_list>

​ FROM taba a

​ RIGHT JOIN tabb b

​ ON a.key = b.key

​ WHERE a.key is NULL

6.FULL JOIN 求并集

​ SELECT <select_list>

​ FROM taba a

​ FULL OUTER JOIN tabb b

​ ON a.key = b.key

7.FULL JOIN 求非交叉结果集

​ SELECT <select_list>

​ FROM taba a

​ FULL OUTER JOIN tabb b

​ ON a.key = b.key

​ WEHRE a.key is NULL OR b.key is NULL

索引

什么是索引

​ 为了提高数据查询速度而设计的数据结构,一般情况下这种数据结构都是B+树(一颗已经排好序的树)。查询时,从树的根节点开始比较,小于根的走左孩子,大于根的走右孩子。

优势

​ 查询时走索引比全表扫描可以大大降低IO,提高查询速度

​ 索引是已经做完排序的列,拿到的数据是已经有序,减少CPU的时候

​ 如果返回的列是索引列,那么都不需要从数据块从拿数据。

劣势

​ 增加了额外的存储需求

​ 如果表设计有问题,而且查询条件很多,建很多索引的话,表所对应的索引甚至可能比表占用的空间还大

​ 索引的存在会降低DML效率,频繁的DML操作甚至会影响执行计划,错误的执行计划会导致SQL执行很慢

​ 如果表很大,索引经常可能需要不停的优化,采集表的统计信息,基于更好更全的统计信息才能有更优的执行计划生成

​ 列有大量NULL值不建议创建索引

索引的分类

​ 1.单值索引:根据一个列创建索引,然而大多数情况下都是根据查询条件创建多值索引

​ 2.唯一索引:索引列的数据是唯一的

​ 3.复合索引:索引的列有多个,比如根据入学时间和学号区间查询所有学生,那么就可以创建一个符合索引(入学时间+学号)

索引B+树

 

假设要查询key=29,根磁盘块1中的17和35比,下一步应该找磁盘快3中的P2,在与该P2中的26和30比,下一步找磁盘快8,找到29这个索引项,然后拿该索引项的指针去数据区拿真实的数据行

该如何决定是否创建索引

​ 1.主键会自动创建索引

​ 2.频繁查询的条件需要建立复合索引

​ 3.和其他表有外键的列,要创建索引

​ 4.频繁执行DML操作的字段不适合创建索引,原因是DML会导致索引重建

​ 5.where 条件用不到的列不适合创建索引

​ 6.抛开主键和特殊场景,一般都是创建复合索引

​ 7.在设计组合索引的时候,应该考虑到查询字段需求和排序字段需求,尽量保持复合索引字段与查询排序条件一致,可以提高效率

​ 8.查询中统计或者分组的字段

​ 9.表太小完全没有必要创建索引,因为只需要一次IO就把整表拿了过来

​ 10.重复值严重的列不适合创建索引,比如100W条记录,而某一列只有3种重复的值,而且三种值绝大多数都是某一种,那么根据该列查询时,选择率非常低,近似于全表扫描。在生产中,主要是表的状态字段或者性别字段等等

​ 有这么多限制,可能创建出来的索引可能会很多,特别是字段特别多的表,这种情况最好和DBA一起协商

转载于:https://my.oschina.net/weiweiblog/blog/1829805

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

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

相关文章

Java基础之反射机制

Java反射机制 反射机制是什么 反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性&#xff1b;这种动态获取的信息以及动态调用对象的方法的功能称为ja…

C#逻辑运算符及解析

文章目录博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 逻辑运算符用于连接一个或多个条件&#xff0c;判断这些条件是否成立。 &#xff23;&#xff03;的逻辑运算符可以分为两类&#xff1a; “&#xff06;” “&#xff5c;” “&…

通过ProGet搭建一个内部的Nuget服务器

.NET Core项目完全使用Nuget 管理组件之间的依赖关系&#xff0c;Nuget已经成为.NET 生态系统中不可或缺的一个组件&#xff0c;从项目角度&#xff0c;将项目中各种组件的引用统统交给NuGet&#xff0c;添加组件/删除组件/以及更新组件即可一键完成&#xff0c;大大提升工作效…

unity官方教程-TANKS(一)

unity官方教程TANKS&#xff0c;难度系数中阶。跟着官方教程学习Unity&#xff0c;通过本教程你可以学会使用Unity开发游戏的基本流程。 一、环境 Unity 版本 > 5.2Asset Store 里面搜索 Tanks!Tutorial ,下载导入 二、项目设置 为了便于开发&#xff0c;很多时候我们选用的…

Play框架的用户验证。

最近刚刚参与一个基于Play框架的管理平台的升级工作&#xff0c;其中涉及到了用户的验证工作。第一次接触play框架&#xff0c;直接看已有代码&#xff0c;有点晕。因此&#xff0c;自己实现了一个简单的用户验证功能。 首先&#xff0c;新建一个User类&#xff0c;包含两个属性…

C#条件运算符if-else的简化格式

文章目录博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 条件运算符&#xff08;&#xff1f;&#xff1a;&#xff09;是&#xff49;&#xff46;……&#xff45;&#xff4c;&#xff53;&#xff45;的简化形式 其使用格式为&#xff1a…

码率控制方式选择

同码率下的图像质量或同图像质量下的码率。 AVCodecContext /** * the average bitrate * - encoding: Set by user; unused for constant quantizer encoding. * - decoding: Set by libavcodec. 0 or some bitrate if this info is available in the strea…

Fortran执行语句中的“双冒号” ::

双冒号“::”&#xff0c;通常出现于Fortran在变量声明中&#xff0c;但是在特殊情况下&#xff0c;也会出现于数组中。例如&#xff1a; ... real,target,dimension(10):: a real,pointer,dimension(:):: pa,pb integer:: n3 ... pa > a(n::1) pb > a(n:10:1) ... 咋一看…

VS配置本地IIS以域名访问

1.IIS下配置自己的网站&#xff0c;添加主机名 2.修改hosts文件&#xff08;C://Windows/System32/drivers/etc&#xff09; 3.VS中配置项目Web服务器&#xff08;选择外部主机&#xff09; 转载于:https://www.cnblogs.com/zuimeideshi520/p/7028544.html

try、catch、finally 和 throw-C#异常处理

文章目录博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应&#xff0c;比如尝试除以零。 异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。…

Spark RDD/Core 编程 API入门系列 之rdd实战(rdd基本操作实战及transformation和action流程图)(源码)(三)...

本博文的主要内容是&#xff1a; 1、rdd基本操作实战 2、transformation和action流程图 3、典型的transformation和action RDD有3种操作&#xff1a; 1、 Trandformation 对数据状态的转换&#xff0c;即所谓算子的转换 2、 Action 触发作业&#xff0c;即所谓得结果…

用GDB调试程序

GDB概述GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许&#xff0c;各位比较喜欢那种图形界面方式的&#xff0c;像VC、BCB等IDE的调试&#xff0c;但如果你是在 UNIX平台下做软件&#xff0c;你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所…

灯塔的出现给那些有想法,有能力而又缺乏资金的社区人士提供了一条途径

2019独角兽企业重金招聘Python工程师标准>>> 在上个月&#xff0c;BCH社区传出基于比特币现金的众筹平台Lighthouse&#xff08;灯塔&#xff09;正在复活的消息&#xff0c;并且有网友在论坛上贴出了部分网站图片。当消息被证实为真&#xff0c;官网和项目的审核细…

PID 算法理解

PID 算法 使用环境&#xff1a;受到外界的影响不能按照理想状态发展。如小车的速度不稳定的调节&#xff0c;尽快达到目标速度。 条件&#xff1a;闭环系统->有反馈 要求&#xff1a;快准狠 分类&#xff1a;位置式、增量式 增量式 输入&#xff1a;前次速度、前前次速度、前…

C#字符串的基本操作

文章目录简介字符串判断是否相等语法实例字符串比较大小语法实例判断字符串变量是否包含指定字符或字符串语法实例查找字符串变量中指定字符或字符串出现的位置语法实例取子串语法实例插入子串语法实例删除子串语法实例替换子串语法实例去除字符串空格语法实例博主写作不容易&a…

C++利用SOCKET传送文件

C利用SOCKET传送文件 /*server.h*/ #pragma comment(lib, "WS2_32") #include <WinSock2.h> #include <iostream> //#include <stdio.h> #include <assert.h> #ifndef COMMONDEF_H #define COMMONDEF_H #define MAX_PACKET_SIZE 10240 …

三种方式在CentOS 7搭建KVM虚拟化平台

KVM 全称是基于内核的虚拟机&#xff08;Kernel-based Virtual Machine&#xff09;&#xff0c;它是一个 Linux的一个内核模块&#xff0c;该内核模块使得 Linux变成了一个Hypervisor&#xff1a;它由 Quramnet开发&#xff0c;该公司于 2008年被 Red Hat 收购 KVM的整体结构&…

(五)EasyUI使用——datagrid数据表格

DataGrid以表格形式展示数据&#xff0c;并提供了丰富的选择、排序、分组和编辑数据的功能支持。DataGrid的设计用于缩短开发时间&#xff0c;并且使开发人员不需要具备特定的知识。它是轻量级的且功能丰富。单元格合并、多列标题、冻结列和页脚只是其中的一小部分功能。具体功…

拾取模型的原理及其在THREE.JS中的代码实现

1. Three.js中的拾取 1.1. 从模型转到屏幕上的过程说开 由于图形显示的基本单位是三角形&#xff0c;那就先从一个三角形从世界坐标转到屏幕坐标说起&#xff0c;例如三角形abc 乘以模型视图矩阵就进入了视点坐标系&#xff0c;其实就是相机所在的坐标系&#xff0c;如下图&am…