zoukankan      html  css  js  c++  java
  • mysql查询性能优化

    mysql查询过程:

    1. 客户端发送查询请求。

    2. 服务器检查查询缓存,如果命中缓存,则返回结果,否则,继续执行。

    3. 服务器进行sql解析,预处理,再由优化器生成执行计划。

    4. Mysql调用存储引擎API执行优化器生成的执行计划进行查询。

    5. 返回结果。

    优化数据访问:

    1. 只获取必要的数据:

      • 是否查询了多余的记录;

      • 多表关联时是否返回了全部列;

      • 是否总是取出全部列(避免select *);

      • 是否重复查询相同的数据(缓存代替)。

    2. 避免额外的记录扫描:查询开销衡量标准(响应时间、扫描行数、返回行数)

      • 响应时间:服务时间(执行查询)+排队时间(IO或者等待资源、锁等);快速上线估计法。

      • 扫描的行数和返回的行数:一般1:1-->1:10。

      • 扫描行数和访问类型:同一行数据的不同访问方式(扫描表、索引、范围访问、唯一索引、常熟引用、单值访问)的扫描行数的差异,通常增加索引是一个最直接的方法。大量扫描返回少量行数的查询优化技巧:

        • 使用索引覆盖扫描:把所有需要的列放到索引中,存储引擎无需回表获取对应的行,直接返回结果。

        • 改变库表结构:增加汇总性表存储,空间换时间,效率。

        • 重写查询:sql结构。

    重构查询方式:

    1. 复杂查询与简单查询的选择:复杂查询考虑的是网络通信,查询解析及优化的因素。将复杂查询分解为多个组合的简单查询有时会是不错的选择。

    2. 切分查询:将大查询切分为多个相同的小查询。例如:删除旧数据时。

    3. 分解关联查询:将分解的单个查询在应用层进行整合。

      • 增加缓存效率:应用服务通常需要缓存常用单表查询,重复利用。

      • 分解的单个查询可以减少锁的竞争。

      • 应用层进行关联,使得数据库拆分更加容易,构建高性能及高扩展性的程序、服务。

      • 查询效率的提升。

      • 减少冗余记录的查询。

      • 应用层的哈希关联效率高于mysql的循环嵌套关联。

    特殊优化:

    1. count(*) 并不是统计所有列,而是是统计行数。

    2. MyISAM的count()在没有where条件的时非常快,优于其它引擎。

    3. 快速、精确、实现简单 只能满足其二。

    4. 优化关联查询:

      • 确保ON或者USING子句中的列上有索引。在创建索引时要考虑关联的顺序,一般来说,除非有其它理由,否则只需要在管理按顺序中的第二表的相应列上创建索引。

      • 确保任何的GROUP BY和ORDER BY中的表达式只涉及到一个表中的列,这样Mysql才能使用索引来优化过程。

      • 升级Mysql需要检查优化。

    5. 5.6之前尽可能使用关联查询代替子查询。
    6. UNION查询:Mysql通过创建填充临时表的方式来执行。

  • 相关阅读:
    读 Zepto 源码之内部方法
    读Zepto源码之代码结构
    vue-auto-focus: 控制自动聚焦行为的 vue 指令
    vue-lazy-render: 延迟渲染大组件,增强页面切换流畅度
    用vue实现模态框组件
    谷歌插件Image downloader开发之popup
    关于const
    Python线程指南(转自AstralWind)
    PyQt中的图形绘制
    sizeof和strlen之间的区别
  • 原文地址:https://www.cnblogs.com/niejunlei/p/6212111.html
Copyright © 2011-2022 走看看