zoukankan      html  css  js  c++  java
  • mysql 处理查询请求过程

    需要搞清楚查询为什么会慢,就要搞清楚mysql处理查询请求的过程:

    1.客户端发送SQL请求给服务器

    2.服务器检查是否可以在查询缓存中命中该SQL

     

    查询缓存对SQL性能的影响。

    1.需要对缓存加锁。

    2.表更新需要对缓存刷新。

     

    对于读写频繁的系统使用查询缓存可能会降低查询的处理效率,在这种情况下不要使用查询缓存。

     

    query_cache_type :设置查询是否可用

    值为:on,off,demand 。

    demand 表示只有在查询语句中使用SQL_CACHE和SQL_NO_CACHE 来控制是否需要缓存。

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

    query_cache_limit 设置查询缓存可用出错的最大值,如果知道结果比较大可以在sql语句加上 SQL_NO_CAHCE提示字 不进行缓存,提高效率。

    query_cache_wlock_invalidate 设置数据表被锁后是否返回缓存中的数据,默认是关闭的。

    query_cache_min_res_unit 设置查询缓存分配的内存快的最小单位。

     

     

    3.服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划

     

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

    解析SQL,预处理,优化SQL执行计划

    3.1会造成MYSQL生成错误执行计划的原因:

    1.统计信息不准确

    2.执行计划中的成本估算不等于实际执行计划的成本。

    mysql 服务器层不知道哪些页面在内存中,哪些在磁盘上,哪些需要顺序读取,哪些页面需要随机读取。

    3.mysql优化器所认为的最优可能与你认为的最优不一样。mysql 是基于成本模型选择最优的执行计划。

    4.mysql 不考虑其他并发查询,这可能会影响当前查询的速度。

    5.mysql 有时也会基于一些固定的规则来生成执行计划。

    6.mysql 不会考虑不受其控制的成本。

      存储过程,用户自定义函数

    3.2mysql 优化器可优化的SQL类型

    1.重新定义表的关联顺序。

    优化器会根据统计信息来决定表的关联顺序。

    2. 将外链接转化成内连接

    3.使用等价变换规则。

         5=5 and a>5 改写为 a>5.

    4.优化 count() ,min(),max()

    5.子查询优化

    6.提前终止查询

    例如:

    select * from user where 1!=1;

    7.对IN条件进行优化。

     

    4.根据执行计划,调用存储引擎API来查询数据。

    5.将结果返回到客户端。

  • 相关阅读:
    Oracle OCP提纲
    Oracle redo 日志损坏的几种情况下的恢复
    Oracle 归档开启切换和归档日志删除(单实例和RAC)
    MySQL mysqldump备份与恢复
    Oracle 卸载
    MySQL脚本自动安装mysql-5.6.15-linux-glibc2.5-x86_64.tar.gz
    Oracle session出现大量的inactive
    Oracle 备份与恢复基础
    NuGet 下载dll
    Azure Service Bus
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/5935904.html
Copyright © 2011-2022 走看看