zoukankan      html  css  js  c++  java
  • MySQL调优学习笔记(六、SQL查询优化)

    目录:

    • 为什么查询速度慢
    • 优化数据访问
    • 重构查询方式
    • 查询缓存
    • 特定类型的优化

    为什么查询速度慢

    如果我们把查询看做是一个任务的话,那么它肯定是由多个子任务构成。

    也就是说如果要优化查询的速度的话,无非就是优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务执行的更快

    优化数据访问

    归根结底性能低下的基本原因就是数据量大,且某些查询无法避免需要筛选大量数据,故大部分性能低下的SQL都可以通过减少访问量的方式进行优化。

    对于低效的SQL往往可以通过以下两种方式来优化:

    • 确认程序是否检索了不需要的数据(多余的行、多余的列)。
      • 查询了不需要的记录
      • 多表关联时返回了全部了列
      • 总是获取全部的列
      • 重复查询相同的数据
    • 确认MySQL服务器的扫描行是否远超实际返回行

    重构查询方式

    1、选择一个复杂的查询还是多个简单的查询。

    2、切分查询(LIMIT)。

    3、分解关联查询。

    查询缓存

    1、如何判断查询是否命中

    MySQL通过计算SQL的Hash值来缓存SQL结果,此中任何字符(例如:空格、注释)的不同都会导致计算的Hash值不一样,导致缓存不能命中。

    当包含如NOW()CURRENT_DATA()之类的函数,或用户自定义函数自定义变量临时表都不会缓存

    注意:MySQL的查询缓存虽然能带来性能的提示,但同时也会降低读写的性能。

    ———————————————————————————————————————————————————————

    2、查询缓存如何使用内存

    除了缓存一些查询的结果外,还需要缓存一些相关的维护数据(大约40KB左右),如哪些内存可用、哪些已用、哪些是映射关系等。

    ———————————————————————————————————————————————————————

    3、查询缓存如何分配内存

    内存分配是非常复杂的,这里简述下最简单的一种。

    初始内存 >>> 一部分 >>> 不够加内存 >>> 释放多余内存

    ———————————————————————————————————————————————————————

    4、分析和配置查询缓存流程图

    ———————————————————————————————————————————————————————

    5、查询缓存的优化

    • 用多个小表替代一个大表对查询缓存有好处。
    • 批量写入时只需要做一次缓存失效,相比单条写入效率更好。
    • 因为缓存空间太大,在过期操作的时候可能会导致服务器僵死。
    • 无法在数据库或者表级别控制查询缓存,但是可以通过SQL_CACHE和SQL_NO_CACHE来控制某个SELECT语句是否需要进行缓存。
    • 对写密集型应用来说,直接禁用查询缓存性能更好。
    • 如果不想所有查询都进入缓存,可以设置query_cache_type为DEMAND。

    特定类型的优化

    1、优化COUNT()查询

    • 使用近似值:执行计划中的值。

    • 汇总表。

    2、优化关联查询

    • 确保on或者USING子句中的列上有索引。
    • 在创建索引的时候要考虑到关联的顺序。
    • 关联查询也可以使用组合索引。

    3、优化GROUP BY

    • 如果需要对关联查询做分组,那通常采用查找表的标识列分组的效率会比其他列更高。

    4、优化LIMIT分页

    • 尽可能的使用索引覆盖扫描,而不是查询所有的列,然后根据需要做一次关联操作再返回所需的列。
    • "延迟关联"将大大提升查询效率,使MySQL扫描尽可能少的页,获取需要访问的记录后再根据关联列回原表查询需要的所有列。

    5、优化UNION查询

    • UNION与UNION ALL的差别,union all不再创建临时表,这样在联合查询时会减少I/O开销。
  • 相关阅读:
    [充电][ios]ios充电接口
    [ios]app后台运行
    [ios][opengles]GLKit如何搭一个app的框架
    [UML]转:UML类图集中关系的总结
    [UML]转:浅谈UML的概念和模型之UML九种图
    [ios][swift]使用swift闭包进行viewcontroller反向传值
    [ios]纯代码实现UITableViewCell的自定义扩展
    [ios][opengles]opengles纹理贴图
    [ios][swift]swift 怎么去除 optional
    mysql数据库指定ip远程访问
  • 原文地址:https://www.cnblogs.com/bzfsdr/p/12354550.html
Copyright © 2011-2022 走看看