查询执行路径

    当希望 MySQL 能够以更高的性能进行查询时,最好的办法就是弄清楚 MySQL 是如何进行优化和查询的。一旦理解这一点,很多查询优化工作实际上就是遵循一些原则让优化器能够按照预想的合理的方式运行。
    下图显示了 MySQL 如何处理一个用户请求的过程。

    从图中可见,它的处理过程大致是这样的:
    (1)客户端发送一条查询给服务器。
    (2)服务器先检查查询缓存,如果命中,则立刻返回缓存结果,否则进入下一步。
    (3)服务端进行 SQL 解析、预处理,再由优化器生成对应的执行计划。
    (4)MySQL 根据优化器生成的执行计划,调用存储引擎的 API 来执行计划。
    (5)返回结果给客户端。
    在优化关联查询时需要强调以下几点:
    (1)确保 ON 或者 USING 子句中的列上有索引。在创建索引的时候就要考虑到关联的顺序。比如,当表 A 和表 B 用列 c 关联时,如果优化器的关联顺序是 B、A,那么就不需要在 B 表的对应列上建立索引。没有用到的索引只会带来额外的负担。一般来说,除非有其他理由,否则只需要在关联顺序中的第二个表的相应列上创建索引。
    (2)确保任何的 GROUP BY 和 ORDER BY 中的表达式只涉及到一个表中的列,这样 MySQL 才有可能使用索引来优化这个过程。
    (3)当升级 MySQL 时需要注意:关联语法、运算符优先级等其他可能会发生变化的地方。因为以前是普通关联的地方可能会变成笛卡尔积,不同类型的关联可能会生成不同的结果等。

注:摘自《高性能 MySQL》第六章 -- 查询性能优化。

猜你喜欢

转载自aisxyz.iteye.com/blog/2405522