①②③④⑤⑥⑦⑧⑨

查询执行基础知识

mysql执行查询过程

① 客户端将查询发送到服务器

② 服务器检查查询缓存 如果找到了就从缓存返回结果 否则进行下一步

③ 服务器解析,预处理和优化查询,生成执行计划

④ 执行引擎调用存储引擎api执行查询

⑤ 服务器将结果发送回客户端

mysql客户端/服务器协议

该协议是半双工通信,可以发送或接收数据,但是不能同时发送和接收决定了mysql的沟通简单又快捷

缺点:无法进行流程控制,一旦一方发送消息,另一方在发送回复之前必须提取完整的消息,就像

抛球游戏,任意时间,只有某一方有球,而且有球在手上,否则就不能把球抛出去(发送消息)

mysql客户端发送/服务器响应

可以设定max_packet_size这个参数控制客户端发送的数据包(一旦发送数据包,唯一做的就是等待结果)

服务器发送的响应由多个数据包组成, 客户端必须完整接收结果,即使只需要几行数据,也得等到全部接收 然后丢掉,或者强制断开连接

(这两个方法好挫,所以我们使用limit子句呀!!)

也可以理解,客户端从服务器 "拉" 数据 ,实际是服务器产生数据 "推"到客户端, 客户端不能说不要 是必须全部装着 !!

常用的Mysql类库 其实是从客户端提取数据 缓存到array(内存)中,然后进行 foreach 处理

但是对于庞大的结果集装载在内存中需要很长时间 如果不缓存 使用较少的内存并且可以尽快工作 但是应用程序和类库交互时候

服务器端的锁和资源都是被锁定的

查询状态

每个mysql连接都是mysql服务器的一个线程 任意一个给定的时间都有一个状态来标识正在发生的事情

使用 show full processlist 命令查看

mysql中一共有12个状态

休眠 查询 锁定 分析和统计 拷贝到磁盘上的临时表 排序结果 发送数据

通过这些状态 知道 "球在谁手上"

查询缓存

解析一个查询 如果开启了缓存 mysql会检查查询缓存 发现缓存匹配 返回缓存之前 检查查询的权限

优化数据访问

查询性能低下最基本的原因是访问了太多的数据

分析两方面:

① 查明应用程序是否获取超过需要的数据 通常意味着访问了过多的行或列

② 查明mysql服务器是否分析了超过需要的行

向服务器请求了不需要的数据

一般请求不需要的数据 再丢掉他们 造成服务器额外的负担 增加网络开销 消耗了内存和cpu

典型的错误:

① 提取超过需要的行 => 添加 limit 10 控制获取行数

② 多表联接提取所有列 => select fruit.* from fruit left join fruit_juice where

.....

③ 提取所有的列 => select id,name... from fruit ... (有时提取超过需要的数据便于复用)

mysql检查了太多数据

简单的开销指标:执行时间 、 检查的行数 、返回的行数

以上三个指标写入了慢查询日志 可以使用 mysqlsla工具进行日志分析

① 执行时间:执行时间只是参考 不可一概而论 因为执行时间 和服务器当时负载有关

② 检查和返回的行:理想情况下返回的行和检查的行一样,但是显示基本不可能 比如联接查询

③ 检查的行和访问类型: 使用 explain sql语句 观察 type 列

typ列:(访问速度依次递增)

① 全表扫描(full table scan)

② 索引扫描(index scan)

③ 范围扫描(range scan)

④ 唯一索引查找(unique index lookup)

⑤ 常量(constant)

可见 type 列为 index 即 sql 语句 基于 索引扫描

rows 列 为 12731 即 扫描了 12731 行

extra列为 using index 即 使用索引过滤不需要的行

mysql会在3种情况下使用where子句 从最好到最坏依次是:

① 对索引查找应用where子句来消除不匹配的行 这发生在存储层

② 使用覆盖索引(extra 列 "using index") 避免访问行 从索引取得数据过滤不匹配的行 这发生在服务层不需要从表中读取行

③ 从表中检索出数据 过滤不匹配的行(extra:using where)

如果发现访问数据行数很大,尝试以下措施:

① 使用覆盖索引 ,存储了数据 存储引擎不会读取完整的行

② 更改架构使用汇总表

③ 重写复杂的查询 让mysql优化器优化执行它

重构查询的方式

优化有问题的查询 其实也可以找到替代方案 提供更高的效率

复杂查询和多个查询

mysql一般服务器可以每秒50000个查询

常规情况下,使用尽可能少的查询 有时候分解查询得到更高的效率

缩短查询

分治法,查询本质上不变,每次执行一小部分,以减少受影响的行数

比如清理陈旧的数据 每次清理1000条

delete from message where create < date_sub(now(),inteval 3 month)

limit 1000

防止长时间锁住很多行的数据

分解联接

把一个多表联接分解成多个单个查询 然后在应用程序实现联接操作

select * from teacher

join school on teacher.id = school.id

join course on teacher.id = course.id

where course.name= 'english'

使用一下语句代替

select * from course where name = 'english'

select * from teacher where course_id = 1024

select * from school where teacher_id in (111,222,333)

第一眼看上去比较浪费,因为增加了查询数量,但是有重大的性能优势

① 缓存效率高,应用程序直接缓存了表 类似第一个查询直接跳过

② 对于myisam表来说 每个表一个查询有效利用表锁 查询锁住表的时间缩短

③ 应用程端进行联接更方便扩展数据库

④ 使用in() 避免联表查询id排序的耗费

⑤ 减少多余行的访问 , 意味着每行数据只访问一次 避免联接查询的非正则化的架构带来的反复访问同一行的弊端

分解联接应用场景:

① 可以缓存早期查询的大量的数据

② 使用了多个myisam表(mysiam表锁 并发时候 一条sql锁住多个表 所以要分解)

③ 数据分布在不同的服务器上

④ 对于大表使用in() 替换联接

⑤ 一个联接引用了同一个表很多次

提取随机行

select * from area order by rand() limit 5;

分组查询

select cname,pname,count(pname) from user by (cname pname with rollup )

外键

只有Innodb引擎支持外键,myisam可以添加外键但是没有效果

主表添加主键id 从表添加外键id引用主表的id

表student

create table `student` (

`id` int(11) not null auto_increment,

`name` varchar(255) default null,

primary key (`id`)

) engine=innodb auto_increment=7 default charset=utf8

表student_extend

create table `student_extend` (

`student_id` int(11) default null,

`age` smallint(5) default null,

key `student_id` (`student_id`),

constraint `student_index` foreign key (`student_id`)

references `student` (`id`) on delete cascade on update no action

) engine=innodb default charset=utf8

为student_extend添加外键 外键指向 student 表中的id 列 在delete时触发外键

表student数据

表student_extend数据

删除表student一条数据 则 外键表就会触发外键 删除对应数据

delete from student where id = 2;

优化联合查询

select * from A limit 10 union all select * from B limit 10

优化max() min()

其中 name 没有索引

select min(id) from fruit where name = "banana"

==>

select id from fruit use index(PRIMARY) where name = 'banana' limit 1

对一个表同时进行select 和 update

mysql 架构优化_Mysql 架构及优化之-查询性能优化相关推荐

  1. 高性能mysql 第六章_第六章 查询性能优化

    1. 为什么查询速度会慢 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化,无非是减少子任务数量,或者减少子任务的执行次数. 查询声明周期:生成计划,执行, ...

  2. 以字节跳动内部 Data Catalog 架构升级为例聊业务系统的性能优化

    背景 字节跳动 Data Catalog 产品早期,是基于 LinkedIn Wherehows 进行二次改造,产品早期只支持 Hive 一种数据源.后续为了支持业务发展,做了很多修修补补的工作,系统 ...

  3. mysql获取查询策略语句_MySQL数据库查询性能优化策略

    优化查询 使用Explain语句分析查询语句 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句. 通过对查询语句的分析,可以了解查询语句的执行 ...

  4. mysql 主键查询性能_MySQL查询性能优化(精)

    MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...

  5. MySQL高性能实战——part3——分析SQL,定位慢SQL(性能优化的前提)

    前言: 此文借鉴<MySQL高性能>一书,还有MySQL官方文档,笔者将通过自身的一些实战经验和阅读习惯对本书进行一个总结,整理,归纳出企业级开发中常用的优化案列和部分概念!! ​ 官方文 ...

  6. MySQL系列-- 4. 查询性能优化

    4. 查询性能优化 4.1 为什么查询速度会变慢 快速查询取决于响应时间 如果把查询看成是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消 ...

  7. 读薄《高性能MySql》(四)查询性能优化

    读薄<高性能MySql>(一)MySql基本知识 读薄<高性能MySql>(二)Scheme与数据优化 读薄<高性能MySql>(三)索引优化 读薄<高性能M ...

  8. mysql笔记03 查询性能优化

    查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减 ...

  9. MySQL查询性能优化七种武器之索引下推

    前面已经讲了MySQL的其他查询性能优化方式,没看过可以去了解一下: MySQL查询性能优化七种武器之索引潜水 MySQL查询性能优化七种武器之链路追踪 今天要讲的是MySQL的另一种查询性能优化方式 ...

  10. MySQL模糊查询性能优化

    一.背景 我们经常在数据库中使用 LIKE 操作符来完成对数据的模糊搜索,LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. 如果需要查找客户表中所有姓氏是"孙"的数据 ...

最新文章

  1. 【练习】OC语法的简单复习
  2. 产生随机数的几种方法
  3. 浅谈数据分析中的“暗物质”
  4. Docker镜像由于代理问题导致不能下载的解决办法
  5. hihocoder1147 时空阵(bfs树+DP)
  6. 串口数据波形显示_【专题教程第6期】SEGGER的J-Scope波形上位机软件,RTT模式波形上传可飙到500KB/S...
  7. android导入项目出现style错误,menu错误
  8. python函数作用域_Python命名空间和作用域的基本认识和一点小魔法
  9. 剑指Offer——完美+今日头条笔试题+知识点总结
  10. ks检验正态分布结果_SPSS实现Shapiro-Wilk正态分布检验
  11. TensorRT学习(1):通过pth生成wts文件
  12. 汤唯:在街头卖艺的那些日子
  13. java中protected_Java中protected方法访问权限的问题
  14. 用AI给图片上色 在线将黑白照片处理成彩色照片工具(干货)
  15. 你的伙伴对你最大会话_甜炸了的表白套路对话 套路深到你无法拒绝
  16. 对一个注册页面编写测试用例
  17. Python的海龟绘图库turtle中tracer(False)和speed(0)的区别
  18. NOI2018网络同步赛游记
  19. MySQL加索引及导数导致的问题
  20. 全球及中国BT筒夹行业投资建议与前景策略分析报告2022版

热门文章

  1. dev chartcontrol获取x y轴的值_终于,奔驰强势接手了腾势X
  2. php txt删除重复行,php – 删除文本文件中的重复行
  3. SVM支持向量机详解
  4. 五十七、Vue中的八大生命周期函数
  5. 二十、深入Python迭代器和生成器
  6. 直播 | 彩云科技CEO袁行远:NLP与冒险游戏研究一览
  7. 线性Attention的探索:Attention必须有个Softmax吗?
  8. MATLAB禁用!!MATLAB教程对高校全免费!!
  9. 浅谈嵌套命名实体识别(Nested NER)
  10. 真的!最难啃的《深度学习》圣经花书,居然新出版了视频课!