文档章节

MySQL 查询优化器(总结)

tara_qri
 tara_qri
发布于 2015/09/29 11:08
字数 809
阅读 185
收藏 1

通过以上对单表查询、复合查询不同情况下的查询分析和测试,对查询优化器有了更深入的理解。同时,通过以上测试,也发现很多在查询中应该优化或者规避的策略,这些策略可以有效的优化SQL语句,减少执行时间。

       具体的策略总结如下:

       1、使用具体的字段名取代‘*’。因为在查询处理过程中,查询优化器在setup_wild()函数中会首先将‘*’转化为具体的具体的表中的字段。

       2、使用具体数据表的字段名取代字段名。即:使用TABLE.FIELD取代FIELD。因为在查询处理中,特别是多表联合查询中,查询优化器在set_field()函数中对不给定具体表名的字段会对所有表进行查询该字段。

       3、使用GROUP条件取代DISTINCT条件。因为在查询处理中,查询优化器会在优化阶段中调用create_distinct_group()函数,将DISTINCT条件转化为GROUP条件来处理。

       4、使用LIMIT条件。在查询结果太多的情况下,查询执行阶段会使用LIMIT过滤查询结果,可以有效的降低查询的时间。

       5、‘,’、JOIN、INNER JOIN、CROSS JOIN在MySQL中是等价的。从查询处理逻辑可以看出,最终JOIN、INNER JOIN、CROSS JOIN会转化为多表的联合查询。并且对于内连接查询来说,ON条件和where条件是一样的,ON条件会在simplify_joins()函数中添加到where条件中。

       6、LEFT JOIN查询会将左部的表的进行全表扫描,而右部的表中如果没有匹配的记录时,会用NULL值填充。而当数据表不能 NULL表时(与是否有where条件过滤有关),则左部不会全部列出所有记录,并将外连接转化为多表联合查询处理。其他的外连接JOIN查询与LEFT JOIN查询类似,不再赘述。特别注意,OUTER JOIN的where条件和ON条件有一些区别:ON条件是在生成查询结果之前,进行的过滤;where条件是在查询结果输出过程中进行的过滤。因此,将过滤条件写到where条件中时,LEFT JOIN查询不会显示左部的所有记录,而是获得符合条件的记录。LEFT JOIN的详细分析和测试,将作为单独的部分呈现。

       7、STRAIGHT_JOIN查询用于在多表查询时指定表载入的顺序。而在指定载入顺序时,要按照表的关联关系进行指定,否则STAIGHT_JOIN会忽略指定顺序,而通过查询优化器进行优化。如果对查询不能保证指定顺序为最优的情况下,不建议使用STAIGHT_JOIN指定载入的顺序。

       8、转化子查询为多表联合查询。子查询需要创建临时表,并且查询的临时结果没有任何索引,导致查询性能较低。转化为多表联合查询可以不需要创建临时表,并且可以有效的利用查询数据表的索引。


本文转载自:http://blog.chinaunix.net/uid-26896862-id-3326447.html

tara_qri
粉丝 10
博文 48
码字总数 21496
作品 1
海淀
私信 提问
第六章 查询性能优化 高性能MySql阅读总结

前面的章节我们介绍了如何设计最优的库表结构、 如何建立最好的索引, 这些对于高性能来说是必不可少的。 但这些还不够一一还需要合理的设计查询。 如果查询写得很糟糕,即使库表结构再合理、...

好好学习Sun
2018/07/09
0
0
「mysql优化专题」这大概是一篇最好的mysql优化入门文章(1)

【mysql优化专题】:本专题全文围绕mysql优化进行全方位讲解,本篇为优化入门篇,让大家知道为什么要优化,究竟在优化什么。喜欢的朋友可以关注收藏。 优化,一直是面试最常问的一个问题。因...

java进阶架构师
2017/11/16
0
0
SQL 常用优化手段总结 - 分析 SQL 语句的一般步骤

数据库的性能调优是一个很大的话题。但是对于开发人员来讲,掌握一些常用的 SQL 优化手段却不是什么难事。 从本章节开始,将连载总结常用的适合于开发人员的 SQL 优化手段与大家分享。 要想解...

给你添麻烦了
2018/01/09
0
0
mysql中select的count星和count1有区别么

之前一直都任务select count(1) from tab的效率要高于count(),今天看了下执行计划才发现原来一直都是一个误解,mysql的优化器会自动转换。 直接上例子 explain SELECT count() FROM employ...

王小明123
2012/09/03
2.2K
0
MySQL · 性能优化 · 条件下推到物化表

背景 MySQL引入了Materialization(物化)这一关键特性用于子查询(比如在IN/NOT IN子查询以及 FROM 子查询)优化。 具体实现方式是:在SQL执行过程中,第一次需要子查询结果时执行子查询并将...

阿里云RDS-数据库内核组
2016/07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
14
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部