一、SQL查询优化(重要)

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

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

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

  3. 实时获取存在性能问题的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 实时获取有性能问题的SQL(推荐)

SELECT id,user,host,DB,command,time,state,infoFROM information_schema.processlistWHERE TIME>=60

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

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

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

通过上图可以清晰的了解到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依照执行计划和存储引擎进行交互

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

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

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

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

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

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

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

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

可以优化的sql类型

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

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

3、使用等价变换规则;

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

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

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

1.6 特定SQL的查询优化

1.6.1 大表的数据修改

1.6.2 大表的结构修改

对表中的列的字段类型进行修改

改变字段的宽度时还是会锁表

无法解决主从数据库延迟的问题

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

  2. (推荐)

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

修改语句这个样子:

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

利用工具修改:

1.6.3 优化not in 和 <> 查询

子查询改写为关联查询:

SELECT customer_id,first_name,last_name,email FROM customerWHERE customer_idNOT IN (SELECT customer_id FROM payment) 

改写后:

SELECT a.customer_id,a.first_name,a.last_name,a.email FROM customer aLEFT JOIN payment b ON a.customer_id = b.customer_idWHERE b.customer_id IS NULL

二、分库分表

2.1 分库分表的几种方式

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

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

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

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

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

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

2.1.3  数据库分片

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

2.1.3.1 如何选择分区键

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

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

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

使用auto_increment_increment和auto_increment_offset参数使用全局节点来生成ID在Redis等缓存服务器中创建全局ID(推荐)

完!

唐成勇

https://segmentfault.com/a/1190000013781544

linux数据泵导入command not found_MySQL:数据库结构优化、高可用架构设计、数据库索引优化...相关推荐

  1. mysql性能结构优化原理_MySQL性能管理及架构设计(二):数据库结构优化、高可用架构设计、数据库索引优化...

    一.数据库结构优化(非常重要) 1.1 数据库结构优化目的 1.减少数据冗余:(数据冗余是指在数据库中存在相同的数据,或者某些数据可以由其他数据计算得到),注意,尽量减少不代表完全避免数据冗余: 2. ...

  2. ef mysql 优化_MySQL性能管理及架构设计(二):数据库结构优化、高可用架构设计、数据库索引优化...

    一.数据库结构优化(非常重要) 1.1 数据库结构优化目的 1.减少数据冗余:(数据冗余是指在数据库中存在相同的数据,或者某些数据可以由其他数据计算得到),注意,尽量减少不代表完全避免数据冗余: 2. ...

  3. MySQL性能管理及架构设计(二):数据库结构优化、高可用架构设计、数据库索引优化...

    一.数据库结构优化(非常重要) 1.1 数据库结构优化目的 1.减少数据冗余:(数据冗余是指在数据库中存在相同的数据,或者某些数据可以由其他数据计算得到),注意,尽量减少不代表完全避免数据冗余: 2. ...

  4. Mysql数据库MMM实现高可用架构

    文章目录 一,MMM介绍 二.MMM搭建 一,MMM介绍 MMM(Master-Master replication manager for MvSQL,MySQL主主复制管理器) 是一套支持双主故障 ...

  5. MySQL 数据库之 MMM 高可用架构构建

    文章目录 一.MMM 概述 1. 什么是 MMM 2. 应用场景 3. MMM 特点 4. 关于 MMM 高可用架构的说明 5. 用户及授权 二.案例环境 1. 服务器配置 2. 服务器环境 3. 修 ...

  6. 架构设计器_MySQL:数据库结构优化、高可用架构设计、数据库索引优化

    一.SQL查询优化(重要) 1.1 获取有性能问题SQL的三种方式 通过用户反馈获取存在性能问题的SQL: 通过慢查日志获取存在性能问题的SQL: 实时获取存在性能问题的SQL: 1.1.2 慢查日志 ...

  7. MySQL:数据库结构优化、高可用架构设计、数据库索引优化

    一.SQL查询优化(重要) 1.1 获取有性能问题SQL的三种方式 通过用户反馈获取存在性能问题的SQL: 通过慢查日志获取存在性能问题的SQL: 实时获取存在性能问题的SQL: 1.1.2 慢查日志 ...

  8. 深度linux使用京麦,京东京麦开放平台的高可用架构之路

    京麦是京东商家的多端开放式工作平台,是京东十万商家唯一的店铺运营管理平台,为京东商家提供在移动和桌面端的操作业务,京麦本身是一个开放的端体系架构,由京东官方和 ISV 为商家提供多样的应用服务. 京麦 ...

  9. ORCALE 19C数据库Linux系统数据泵导入步骤

    管理员登录 sqlplus / as sysdba 创建表空间 通过下面的指令创建表空间 create temporary tablespace 表空间名字 tempfile' 文件名.dbf ' s ...

最新文章

  1. java web乱码_【SpringBoot WEB 系列】RestTemplate 之中文乱码问题 fix
  2. Linux——curl(转)
  3. Python中print()函数不换行的方法
  4. C++中之---数组和vector
  5. 如何系统地学习深度学习(从初级到高级,初学者必看)
  6. k8s nginx-ingress 上传大小限制问题配置
  7. openCV银行卡号识别
  8. 多线程编程warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 错误解决
  9. 估计值与平均值的离差平方和_各变量值与其算术平均数的离差平方之和为()
  10. 植物大战僵尸修改阳光
  11. word选择性粘贴没有HTML选项,Word选择性粘贴如何使用?Word选择性粘贴的快捷键是什么?...
  12. l440加装固态硬盘ngff_联想L440笔记本电脑加装固态硬盘笔记
  13. 全网最简单的RFM模型制作方法,3岁小孩都能学会!
  14. 揭露数据不一致的利器 —— 实时核对系统
  15. “最难就业季“中的大学生就业:本硕过半有着落 高职生成香饽饽
  16. vscode+svn
  17. excel文件损坏修复绝招_Excel被删除并清空,会计别哭,一招拯救!
  18. 怎么解决word中英文混合换行后字体间隔变大问题
  19. ✿2021NEWCTF6.1萌新赛✿MISC-all-WP
  20. linux 命令行 英语词典

热门文章

  1. zencart 如何修改在线人数和订单编号
  2. 【译】微型ORM:PetaPoco
  3. 【转】盛大创新院许式伟:影响我一生的五个重要选择
  4. 【剑指offer】面试题34:二叉树中和为某一值的路径
  5. Js拼接嵌套php代码,分享一个js文件中嵌套php会出错的问题
  6. 7-二进制,十进制,十六进制
  7. 语言条件语序心得_考研分享 | 王远新语言学教程要点总结(第五章)
  8. 如何卸载mysql server 2005_如何卸载SQL Server 2005
  9. php分页技术的作用,分页原理技术细节剖析(php+mysql)实例
  10. python+OpenCV图像处理(五)图像的阈值分割