900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > mysql分库分表优化性能 MySQL性能管理及架构设计(三):SQL查询优化 分库分表 - 完结篇...

mysql分库分表优化性能 MySQL性能管理及架构设计(三):SQL查询优化 分库分表 - 完结篇...

时间:2023-12-16 14:04:48

相关推荐

mysql分库分表优化性能 MySQL性能管理及架构设计(三):SQL查询优化 分库分表 - 完结篇...

一、SQL查询优化(重要)

1.1 获取有性能问题SQL的三种方式

通过用户反馈获取存在性能问题的SQL;

通过慢查日志获取存在性能问题的SQL;

实时获取存在性能问题的SQL;

1.1.2 慢查日志分析工具

相关配置参数:

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 实时获取有性能问题的Sad-imageshu.io/upload_images/0641-791ae20aa9662a09.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

image.gif

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 查询过程描述(重点!!!)

image

image.gif

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

发送SQL语句。

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

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

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

返回结果。

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依照执行计划和存储引擎进行交互

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

image

image.gif

image

image.gif

image

image.gif

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

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

1、统计信息不准确 2、成本估算与实际的执行计划成本不同

image

image.gif

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

image

image.gif

4、MySQL不考虑并发查询 5、会基于固定规则生成执行计划 6、MySQL不考虑不受其控制的成本,如存储过程,用户自定义函数

感谢大家一直来支持,这是我准备的1000粉丝福利

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

查询优化器:对查询进行优化并查询mysql认为的成本最低的执行计划。 为了生成最优的执行计划,查询优化器会对一些查询进行改写

可以优化的sql类型

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

image

image.gif

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

3、使用等价变换规则;

image

image.gif

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

image

image.gif

5、将一个表达式转换为常数; 6、子查询优化;

image

image.gif

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%';

image

image.gif

image

image.gif

1.6 特定SQL的查询优化

1.6.1 大表的数据修改

image

image.gif

image

image.gif

1.6.2 大表的结构修改

image

image.gif

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

(推荐)

大厂2000道面试题(含答案)

添加一个新表(修改后的结构),老表数据导入新表,老表建立触发器,修改数据同步到新表, 老表加一个排它锁(重命名), 新表重命名, 删除老表。

image

image.gif

修改语句这个样子:

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

利用工具修改:

image

image.gif

1.6.3 优化not in 和 <> 查询

子查询改写为关联查询:

image

image.gif

二、分库分表

2.1 分库分表的几种方式

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

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

image

image.gif

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

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

image

image.gif

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

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

2.1.3 数据库分片

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

image

image.gif

2.1.3.1 如何选择分区键

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

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

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

image

image.gif

喜欢我的文章就关注我吧,持续更新中.....

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以点击进入暗号:知乎。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。