高性能MYSQL(四)

2017-07-10  本文已影响0人  walker_liu_fei

可以通过explain 语句来对查询进行查看.对可优化的地方做出改进

前言

优化的主要组成部分:

一个查询操作实际上是多个子任务组成,优化查询实际上是优化子任务的执行

优化数据访问

避免存储多余数据

避免无用的查询

SELECT * FROM A INNER JOIN B WHRER A.ID = B.A_ID

重构查询时的方式

一个复杂的查询还是多个简单的查询

对于mysql 来说,MYSQL从设计上让连接和断开链接都很轻量级,在返回一个小的查询结果方面很高效。对于网络链接来说现代网络链接的效率相对与磁盘IO的效率来说已经不是问题。通常来将,两者的区别不仅仅在于传输速度,磁盘IO在查询时还有Lookup的过程。

对于复杂的查询来说,将其分解成多个简单的查询。或许效率更快些。但是同样的,具场景具体分析

将复杂的操作切分带来的另一个好处是可以分解复杂操作长时间对于读/写锁长时间占有,从而避免影响其他业务操作的执行

image.png
  1. 客户端发送一条查询给服务器
  2. 服务器首先查询缓存。如果命中,则立即返回存储在存储在缓存中的结果。否则进入下一阶段
  3. 服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划
  4. MYSQL根据优化器生成的执行计划,调用存储引擎的API来执行查询
  5. 将结果集返回给客户端

MYSQL 客户端和服务器端通信

总的来说,MYSQL客户端和服务器端是一个半双工的通信状态,也就是说,在同一个时间,只能有一端像另一端发送数据(不要被JDBC的线程池的概念混淆)

SHOW ALL PROCESSLIST

各个MYSQL链接对应的状态 :

查询缓存

查询缓存是通过一个对 大小写敏感的哈希查找实现的。如果缓存中缓存有对应数据。数据会直接返回给客户端。

查询处理优化

查询的下一周期是将一个SQL 转换为一个执行计划,MYSQL再依照这个计划和存储引擎进行交互。这包括多个子阶段:解析SQL,预处理,优化SQL执行计划。

语法解析器和预处理

阶段所做工作

查询优化器

explain SELECT * FROM commonservice.regions where amapid is not  null;

show  status like 'Last_query_ cost'
Variable_name Value
'Last_query_cost' '142998.599000'

上面的查询结果上面的查询需要 142998个数据页的随机查找才能完成这个查询。当然这只是查询优化器的评估结果,且优化器在评估时不会考拉

MYSQL能够优化的的类型

重新定义关联表的顺序 : 数据表的关联并不是按照在查询中指定的顺序执行
将外链接转换为内链接 : 并不是所有的OUTER JOIN 语句都必须以外链接的方式执行。例如,WHERE条件,库表结构都可能会让外链接等价于一个内连接

Mysql 如果执行关联查询

执行计划 : MYSQL 并不会生成查询字节码来执行查询。MYSQL生成查询的一颗指令树,然后通过存储引擎执行完成这可指令树并返回结果。最终执行计划包含了重构查询的全部信息

优化特定类型的查询

优化COUNT()查询
  1. 如果想要查询行数,使用count() 进行查询,如果在count()函数中指定了某列,查询的是这个列有值(非 NULL)的值的个数!
优化关联查询
  1. 确保ON或者USING 子句的列上有索引,一般来说,除非有其他理由,否则只需要在关联顺序中的第二个表上建立索引
  2. 确保仁和Group by 或者Order by中的表达式只涉及到一个表中的列
GROUP By 和 DISTINCT
  1. 在无法使用索引的时候,GROUP BY使用临时表或者文件排序来分组
  2. 如果需要对 关联查询做分组,并且是按照查找表中的某个列进行分组,那么通常采用查找表的标识列分组的效率比其他列更高
上一篇 下一篇

猜你喜欢

热点阅读