MySQL查询优化

  1. 应用WHERE语句的条件

    在索引中使用where条件来过滤不匹配的记录,在存储引擎年后过滤层完成

    使用索引覆盖扫描(Extra中出现了Using index)来返回记录,直接从索引中过滤不需要的 记录并返回命中结果,这是在MySQL服务层完成的,但无须再回表查询记录。

    从数据表中返回记录,然后过滤不满足条件的记录(在Extra出现Using Where)这是在服务层完成的 , MySQL需要先从数据表读出记录然后过滤。

  2. 若查询中需要扫描大量的数据只返回少数的行

    使用索引覆盖,把需要用到的列都放到索引中,这样存储引擎无需回表获取对应行就可以返回结果了

    改变库表结果例如使用单独汇总表

    重写这个复杂的查询,让MySQL优化器 能够以更优化的方式执行这个查询

  3. 重构查询方式

    一个复杂查询or多个简单查询

    切分查询:分而治之

    分解关联查询:对每个表进行一次单表查询,然后在应用程序中进行关联

    分解关联查询的优势:1.让缓存的效率更高。 2.执行单个查询可以减少锁的竞争。 3. 在应用层进行关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。4. 查询本身效率可能会有提升。5.减少冗余记录的查询。6这样相当于在应用中实现了哈希关联,而不是使用MySQL的嵌套循环关联。

    查询缓存

  4. MySQL的优化类型

    重新定义关联表的顺序

    将外链接转化成内连接

    使用等价变换规则

    优化count()min()max()

    预估并转化为常数表达式

    覆盖索引扫描

    子查询优化

    提前终止查询

    等值传播

    列表IN()的比较:mysql会将in()列表里面的内容排序再利用二分查找来确定列表的值是否满足条件这是一个logn的操作

  5. MySQL查询过程

    1.查缓存,若缓存中没有转2,否则返回结果

    2.预处理,优化得到优化树 生成执行计划 转3

    3.查询执行引擎,调用执行引擎的api执行查询

    4.返回查询结果,如果结果可以被缓存,就缓存,结果集返回给客户端是一个增量、逐步返回的过程 结果集中每一行都会以一个满足MySQL客户端/服务器通信协议的风暴发送,再通过tcp协议进行传送,在tcp传送中可能对MySQL的封包进行缓存然后批量进行传输

  6. 优化关联查询

    确保on或者using子句中的列上有索引,在创建索引的时候就要考虑到关联的顺序。一般在关联顺序的第二个表的相应列上创建索引

    确保group by 和order by的表达式只涉及到一个表的列

    当升级MySQL的时候需要注意:关联语法,运算符优先级等其他可能会发生变化的地方

发布了91 篇原创文章 · 获赞 4 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章