mysql分表 查询 优化_MySQL性能管理及架构(查询优化、分库分表)一遍文章搞定...

相关配置参数:

slow_query_log # 启动停止记录慢查日志,慢查询日志默认是没有开启的可以在配置文件中开启(on)

slow_query_log_file # 指定慢查日志的存储路径及文件,日志存储和数据从存储应该分开存储

long_query_time # 指定记录慢查询日志SQL执行时间的阀值默认值为10秒通常,对于一个繁忙的系统来说,改为0.001秒(1毫秒)比较合适

log_queries_not_using_indexes #是否记录未使用索引的SQL

复制代码

常用工具: mysqldumpslow 和 pt-query-digest

pt-query-digest --explain h=127.0.0.1,u=root,p=p@ssWord slow-mysql.log

复制代码

1.1.3 实时获取有性能问题的SQL(推荐)

87a449f68513d7623ea93db33b418e59.png

SELECT id,user,host,DB,command,time,state,info

FROM information_schema.processlist

WHERE TIME>=60

复制代码

查询当前 服务器 执行超过60s的SQL,可以通过脚本周期性的来执行这条SQL,就能查出有问题的SQL。

1.2 SQL的解析预处理及生成执行计划(重要)

1.2.1 查询过程描述(重点!!!)

90e0c5839d4df1acd892373f73ca1b7e.png 通过上图可以清晰的了解到 MySql 查询执行的大致过程:

1.发送SQL语句。

2.查询缓存,如果命中缓存直接返回结果。

3.SQL解析,预处理,再由优化器生成对应的查询执行计划。

4.执行查询,调用存储引擎API获取数据。

5.返回结果。

1.2.2 查询缓存对性能的影响(建议关闭缓存)

第一阶段:

相关配置参数:

query_cache_type # 设置查询缓存是否可用

query_cache_size # 设置查询缓存的内存大小

query_cache_limit # 设置查询缓存可用的存储最大值(加上sql_no_cache可以提高效率)

query_cache_wlock_invalidate # 设置数据表被锁后是否返回缓存中的数据

query_cache_min_res_unit # 设置查询缓存分配的内存块的最小单

复制代码

缓存查找是利用对大小写敏感的哈希查找来实现的,Hash查找只能进行全值查找(sql完全一致),

如果缓存命中,检查用户权限,如果权限允许,直接返回,查询不被解析,也不会生成查询计划。

复制代码

在一个读写比较频繁的系统中,建议 关闭缓存 ,因为缓存更新会加锁。将 query_cache_type 设置为 off , query_cache_size 设置为 0 。

1.2.3 第二阶段:MySQL依照执行计划和存储引擎进行交互

这个阶段包括了多个子过程:

8b4c9497c414726569e6011b29d470ec.png

0f9e374ef2c65cd246a174e14bae1667.png

3579c6b7c846512130e182199e531baa.png

一条查询可以有多种查询方式,查询优化器会对每一种查询方式的(存储引擎)统计信息进行比较,找到成本最低的查询方式,这也就是索引不能太多的原因。

1.3 会造成MySQL生成错误的执行计划的原因

1、统计信息不准确

2、成本估算与实际的执行计划成本不同

0ad31c04ef51ec77a7318060cc6145ef.png

3、给出的最优执行计划与估计的不同

d8d2b7428eeb3d5a7893c06403985b3d.png

4、MySQL不考虑并发查询

5、会基于固定规则生成执行计划

6、MySQL不考虑不受其控制的成本,如存储过程,用户自定义函数

1.4 MySQL优化器可优化的SQL类型

查询优化器:对查询进行优化并查询mysql认为的成本最低的执行计划。

为了生成最优的执行计划,查询优化器会对一些查询进行改写

复制代码

可以优化的sql类型

1、重新定义表的关联顺序;

bf8a8ccc71189595f04b4b7713e59bb6.png

2、将外连接转换为内连接;

3、使用等价变换规则;

7b9bef6344f714773a82b873d8dbd334.png

4、优化count(),min(),max();

536129baf868303046774fdc5ba93e13.png

5、将一个表达式转换为常数;

6、子查询优化;

f78e65cb8bea7f8d4c8c45ada8e9c646.png

7、提前终止查询,如发现一个不成立条件(如where id = -1),立即返回一个空结果;

8、对in()条件进行优化;

1.5 查询处理各个阶段所需要的时间

1.5.1 使用profile(目前已经不推荐使用了)

set profiling = 1; #启动profile,这是一个session级的配制执行查询

show profiles; # 查询每一个查询所消耗的总时间的信息

show profiles for query N; # 查询的每个阶段所消耗的时间

1.5.2 performance_schema是5.5引入的一个性能分析引擎(5.5版本时期开销比较大)

启动监控和历史记录表: use performance_schema

update setup_instruments set enabled='YES',TIME = 'YES' WHERE NAME LIKE 'stage%';

update set_consumbers set enabled='YES',TIME = 'YES' WHERE NAME LIKE 'event%';

复制代码

c69a74f568e2fbad98f5103890a95679.png

69887b8248526c13b85a492fa6faf101.png

1.6 特定SQL的查询优化

1.6.1 大表的数据修改

fb09a79bb0bc5433ed0778e9e3a978a0.png

e47d4d400f31d1b44e9ac0131f86a38c.png

1.6.2 大表的结构修改

a3f26f09ea2ad38850693acd6293af9f.png

1.利用主从复制,先对从服务器进入修改,然后主从切换

2.(推荐)

添加一个新表(修改后的结构),老表数据导入新表,老表建立触发器,修改数据同步到新表,

老表加一个排它锁(重命名), 新表重命名, 删除老表。

复制代码

3a6c543b9779f9edb101a671abb7984d.png

修改语句这个样子:

alter table sbtest4 modify c varchar(150) not null default ''

复制代码

利用 工具 修改:

4cc93d3acedbaa408081462f0b9e6533.png

1.6.3 优化not in 和 <> 查询

子查询改写为关联查询:

f674c52b742a527ba7eee23f8e5ee6bc.png

二、分库分表

2.1 分库分表的几种方式

分担读负载 可通过 一主多从,升级硬件来解决。

复制代码

2.1.1 把一个实例中的多个 数据库 拆分到不同实例(集群)

5992e495026eb9d94f3af7346f753e1e.png

拆分简单,不允许跨库。但并不能减少写负载

复制代码

2.1.2 把一个库中的表分离到不同的数据库中

a6675a15450a07c187a6ca979f28c65d.png

该方式只能在一定时间内减少写压力。

以上两种方式只能暂时解决读写性能问题。

2.1.3 数据库分片

对一个库中的相关表进行水平拆分到不同实例的数据库中

复制代码

bd326a87eea739044a126443b1570c56.png

2.1.3.1 如何选择分区键

1.分区键要能尽可能避免跨分区查询的发生

2.分区键要尽可能使各个分区中的数据平均

2.1.3.2 分片中如何生成全局唯一ID

248dde229597541f135eeaadc0d0613c.png

扩展:表的垂直拆分和水平拆分

随着业务的发展,数据库成为了整个系统性能的一个瓶颈,这时候就需要对数据库进行优化,但是单单是优化只能提高有限的一点性能,这时候要想解决问题需要的是从数据库架构层面去思考问题。数据库的架构是一个很大的课题,里面最实用的有两个,一个是数据库拆分,一个是读写分离。今天就来谈谈数据库的两种拆分方式。

一、垂直拆分

垂直拆分很简单,就是根据不同的业务来划分不同的数据库。比如一个电商系统根据业务可以分成商品表、会员表、订单表。原先,这些表都是放在同一个数据库服务器上,现在需要垂直拆分数据库,就是将商品表单独放在一个数据库中,会员表单独放在一个数据库中,订单表单独放在一个数据库中,这样就解决了表与表之间的io竞争。

二、水平拆分

垂直拆分比较简单,水平拆分就比较复杂了,要考虑很多东西。垂直拆分根据业务来拆分,或者说的直白点就是根据表名来拆分,而水平拆分是根据表里面的字段来拆分(记住是根据字段来拆分,而不是拆分字段,拆分后的每一张表的表结构都是一样)。比如要拆分用户表,可以根据用户的注册时间这一字段来拆分整个表,2016年注册的用户放在用户表1中,2017年注册的用户放在用户表2中,2018年注册的用户放在用户表3中。这就是水平拆分,看似很简单,实际上要考虑的东西是很多的。就比如上述的例子,我们用时间来拆分,就会有局限性。一个好产品上线后,在开始的时候用户数量都是很少的,都需要一定时间的沉淀,才会有一个用户数量的爆发期。如果用时间来拆分,就会出现一种情况,就是用户表1的规模很小,而用户表2的规模却很大,是用户表1的好几倍,而用户表三可能是用户表1的好几十倍。这样的话,拆分水平拆分的意义就不大了。一般用户表都是用户id来拆分的,具体还要结合实际业务去分析。所以,水平拆分是一件很复杂的事情,大家在进行水平拆分的时候一定要考虑到方方面面,这样才能设计出优秀的数据库架构方案。

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

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

相关文章

dokcer mysql修改编码_默认支持utf8编码的mysql docker镜像

其他人都是不正确的使用mysql容器镜像可以很快速的运行mysql&#xff0c;免去了传统的虚拟机安装方式的繁琐配置。但是使用官方的mysql镜像&#xff0c;你会遇到中文乱码的问题&#xff0c;原因是官方镜像的字符集默认值不是utf8。这时候你去google&#xff0c;会找到一些文章&…

mysql临时表 清空_在数据库中临时表什么时候会被清除呢

展开全部我们仍使用 实验 05 中的环境&#xff0c;略去准备数据的过程。我们仍然使用两个会话&#xff0c;62616964757a686964616fe59b9ee7ad9431333433646439一个会话 run&#xff0c;用于运行主 SQL&#xff1b;另一个会话 ps&#xff0c;用于进行 performance_schema 的观察…

locust mysql_locust性能压测连接mysql,随机取出班级,绑定学生

from locust import HttpLocust, TaskSet, taskimport pymysqlimport randomclass UserBehavior(TaskSet):def on_start(self):db pymysql.connect("ip地址", "用户名", "密码", "数据库")cursor db.cursor()cursor.execute("S…

mysql无法添加或更新子行_违反完整性约束:1452无法添加或更新子行:

我试图在我的注释表中插入值&#xff0c;但出现错误。俗话说&#xff0c;我不能添加或更新子行&#xff0c;我也不知道这意味着什么。我的架构看起来像这样-- ------------------------------ Table structure for comments-- ----------------------------DROP TABLE IF EXIST…

python医学图像分割_基于cv2的医学图像分割

例如&#xff0c;图像如下所示&#xff1a;import cv2import numpy as npimg cv2.imread("mdb168.pgm",0)import matplotlib.pyplot as pltplt.imshow(img, cmap"gray")我想删除图像中所有的伪影和不必要的部分。在为此&#xff0c;我首先对图像进行二值化…

python解析response的json_从HTML responseTex解析JSON

因此&#xff0c;我大体上同意&#xff0c;更好的解决方案是确保服务器只返回JSON&#xff0c;不过这是通过客户端Javascript实现的一种快速方法&#xff0c;如Barmer所建议的那样&#xff0c;将html解析到DOM&#xff0c;获取body中的文本childNode并在其上运行JSONParse。在v…

mysql 密码修改时间_Mysql修改密码的方法

修改mysql密码的方法&#xff1a;最简单的&#xff0c;在Navicat连接后点用户&#xff0c;找到rootlocalhost直接修改。注意如果装了xampp&#xff0c;在phpmyadmin配置文件也需要改两处密码。下面是在命令行修改的方法。方法1&#xff1a;用mysqladmin----------------亲测这个…

svn版本库浏览器_在SVN版本库浏览器中直接编辑文件保存后不会弹..._网络编辑_帮考网...

原因是没有实际添加到版本库中&#xff0c;要添加到版本库必须执行“Commit”。具体分析如下&#xff1a;SVN错误处理svn : Couldn’t perform atomic initialization. 临时解决办法&#xff1a;升级sqlite。原本安装的是 subversion 1.6.16 sqlite 3.6.13&#xff0c;一直报”…

ubuntu下使用python将ppt转成图片_Ubuntu下使用Python实现游戏制作中的切分图片功能...

本文实例讲述了Ubuntu下使用Python实现游戏制作中的切分图片功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;why拿到一个人物行走的素材&#xff0c;要用TexturePacker打包。TexturePacker打包后&#xff0c;助于游戏加载图片效率&#xff0c;且比较好管理。目前得…

世上最简单的mysql_mysql这样学最简单|基本操作上

这是数据库系列的第一篇文章&#xff0c;主要是对mysql的基本操作有一个了解。本系列的教程会先从基础出发&#xff0c;逐步过渡到优化。一、前提在这里我们不会从如何去安装数据库开始讲起&#xff0c;而是在安装完之后从操作数据库开始&#xff0c;文中所有的代码均在我自己的…

django ipython shell_django shell ipython 模型层优化(关联对象) 懒加载和预加载 +长链接...

懒加载存在于外键和多对多关系不检索关联对象的数据调用关联对象会再次查询数据库问题根源查看django orm的数据加载,两次. 查询user,查询menu第一次查询 用户表 第二次查询 app表cmd:python manage.py shell #进入shell调试 或者ipythonfrom authorization.models import Use…

zabbix4.0添加mysql报警_Zabbix4.0系统告警“Zabbix server is not running”

第一步&#xff1a; 查看系统日志&#xff0c;进一步确认原因1 cat /var/log/zabbix/zabbix_server.log问题出现在数据库。第二步 数据库确认1 mysql -u root -p #root用户登陆数据库如果登录不成功&#xff0c;就看一下登录密码是否正确以及zabbix用户是否有权限登录数据库。1…

影响索引的mysql函数_mysql索引对排序的影响实例分析

本文实例讲述了mysql索引对排序的影响。分享给大家供大家参考&#xff0c;具体如下&#xff1a;索引不仅能提高查询速度&#xff0c;还可以添加排序速度&#xff0c;如果order by 后面的语句用到了索引&#xff0c;那么将会提高排序的速度。测试1、创建测试表&#xff1a;t15表…

php如何对 mysql 中text类型拆分存入一个数组_PHP递归实现无限级分类,可选返回字符串和数组...

正 文&#xff1a;在一些复杂的系统中&#xff0c;要求对信息栏目进行无限级的分类&#xff0c;以增强系统的灵活性。那么PHP是如何实现无限级分类的呢&#xff1f;我们在本文中使用递归算法并结合mysql数据表实现无限级分类。递归&#xff0c;简单的说就是一段程序代码的重复调…

python 开发框架 ant_Golang/python语言开发的分布式游戏服务器框架 mqant

软件介绍mqantmqant 是一款基于 Golang 语言的简洁&#xff0c;高效&#xff0c;高性能的分布式游戏服务器框架&#xff0c;研发的初衷是要实现一款能支持高并发&#xff0c;高性能&#xff0c;高实时性的游戏服务器框架&#xff0c;也希望 mqant 未来能够做即时通讯和物联网方…

java w3c xml_org.w3c.dom(java dom)解析XML文档

首先来了解点Java DOM 的 API:1.解析器工厂类&#xff1a;DocumentBuilderFactory创建的方法&#xff1a;DocumentBuilderFactory dbf DocumentBuilderFactory.newInstance();2.解析器&#xff1a;DocumentBuilder创建方法&#xff1a;通过解析器工厂类来获得 DocumentBuilder…

java中小数点位数_Java中限制小数位数问题

在Java中限制小数位数的方法不止一种&#xff0c;下面我们以限制两位小数为例来说明几种限制小数位数的方法&#xff0c;其他位数可以以此类推方式一&#xff1a;四舍五入double f 111231.5585;BigDecimal b new BigDecimal(f);double f1 b.setScale(2,…

orange pi java_[中文]Orange Pi家族各大成员一览表

全部复制来自官网&#xff0c;只修改了错别字和优化了排版。Orange Pi Zero香橙派Zero是一款开源的单板电脑&#xff0c;新一代的arm开发板,它可以运行Android4.4、Ubuntu、Debian等操作系统。香橙派Zero使用全志H2系统级芯片&#xff0c;同时拥有256MB/512MB DDR3 内存(256MB为…

java 微服务源码_基于Java的微服务架构源码案例Abixen

微服务越来越受欢迎&#xff0c;每个月都有更多的库包和解决方案来支持微服务的开发测试&#xff0c;很多Java开发人员虽然听说过微服务&#xff0c;但是真正采用还是有犹豫的&#xff1a;“我知道&#xff0c;微服务是非常棒的&#xff0c;微服务器更容易维护和进一步开发&…

rocketmq java例子_SpringBoot和RocketMQ的简单实例

1&#xff0c;引用jar包build.gradle文件添加jar包引用compile group: org.apache.rocketmq, name: rocketmq-spring-boot-starter, version: 2.1.12&#xff0c;配置文件application.properties 配置文件spring.application.nameapp-dempserver.port8081###rocketmq###rocketm…