开发人员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,一经查实,立即删除!

相关文章

通过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;很多时候我们选用的…

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

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;即所谓得结果…

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

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

PID 算法理解

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

三种方式在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…

旧知识打造新技术--AJAX学习总结

AJAX是将旧知识在新思想的容器内进行碰撞产生的新技术&#xff1a;推翻传统网页的设计技术。改善用户体验的技术。 学习AJAX之初写过一篇《与Ajax的初次谋面》。当中都仅仅是一些自己浅显的理解&#xff0c;这次就总结一下它在历史长河中的重要地位。 【全】 AJAX全称为Asnychr…

redis(一)--认识redis

Redis官网对redis的定义是&#xff1a;“Redis is an open source, BSD licensed, advanced key-value cache and store”&#xff0c;可以看出&#xff0c;Redis是一种键值系统&#xff0c;可以用来缓存或存储数据。Redis是“Remote Dictionary Server”&#xff08;远程字典服…

SQLSEVER 中的那些键和约束

SQL Server中有五种约束类型&#xff0c;各自是 PRIMARY KEY约束、FOREIGN KEY约束、UNIQUE约束、DEFAULT约束、和CHECK约束。查看或者创建约束都要使用到 Microsoft SQL Server Managment Studio。1. PRIMARY KEY约束 在表中常有一列或多列的组合&#xff0c;其值能唯一标识表…

Confluence 6 手动备份站点

2019独角兽企业重金招聘Python工程师标准>>> Confluence 被配置自动备份数据&#xff0c;使用压缩的 XML 格式。同时你也可以通过 Confluence 的 管理员控制台&#xff08;Administration Console&#xff09;手动进行备份。 你需要具有 System Administrator 权限才…

第六篇:python基础之文件处理

第六篇&#xff1a;python基础之文件处理 阅读目录 一.文件处理流程二.基本操作2.1 文件操作基本流程初探2.2 文件编码2.3 文件打开模式2.4 文件内置函数flush2.5 文件内光标移动2.6 open函数详解2.7 上下文管理2.8 文件的修改一.文件处理流程 打开文件&#xff0c;得到文件句柄…

前端每日实战:56# 视频演示如何用纯 CSS 描述程序员的生活

效果预览 按下右侧的“点击预览”按钮可以在当前页面预览&#xff0c;点击链接可以全屏预览。 https://codepen.io/comehope/pen/YvYVvY 可交互视频 此视频是可以交互的&#xff0c;你可以随时暂停视频&#xff0c;编辑视频中的代码。 请用 chrome, safari, edge 打开观看。 ht…

从特殊到一般-C#中的类

文章目录类的概念类的定义实例例子分析类的成员数据成员属性成员方法成员静态成员博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 类的概念 在日常生活中&#xff0c;类是对具有相同特性的一类是物的抽象。比如水果是一个类&#xff0c;它是对…

从一般到特殊-C#中的对象

文章目录对象的概念对象的创建和使用匿名类型和初始化器构造函数和析构函数构造函数析构函数范例参数传递博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 对象的概念 类是具有相同特征一类事物的抽象&#xff0c;而对象是类的实例。 类和对象…

改变世界的七大NLP技术,你了解多少?(上)

什么是NLP&#xff1f; 自然语言处理&#xff08;NLP&#xff09; 是计算机科学&#xff0c;人工智能和语言学的交叉领域。目标是让计算机处理或“理解”自然语言&#xff0c;以执行语言翻译和问题回答等任务。 随着语音接口和聊天机器人的兴起&#xff0c;NLP正在成为信息时代…

MINI类-结构体

文章目录结构体的定义和使用实例类和结构体的关系博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 结构体与类相似&#xff0c;通常用来封装小型的相关变量组&#xff0c;例如&#xff0c;学生的学号、姓名、性别、年龄等。结构是一种值类型&am…