博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL 查询优化器(总结)
阅读量:7033 次
发布时间:2019-06-28

本文共 1200 字,大约阅读时间需要 4 分钟。

hot3.png

通过以上对单表查询、复合查询不同情况下的查询分析和测试,对查询优化器有了更深入的理解。同时,通过以上测试,也发现很多在查询中应该优化或者规避的策略,这些策略可以有效的优化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、转化子查询为多表联合查询。子查询需要创建临时表,并且查询的临时结果没有任何索引,导致查询性能较低。转化为多表联合查询可以不需要创建临时表,并且可以有效的利用查询数据表的索引。

转载于:https://my.oschina.net/u/1269959/blog/512226

你可能感兴趣的文章
拷贝构造函数为何传入引用?
查看>>
at命令及服务
查看>>
sqlserver无法在数据库上放置锁
查看>>
完全背包问题
查看>>
resin app server安装总结
查看>>
订单信息表和订单明细表
查看>>
背包九讲
查看>>
AS莫名报错 Error:Could not download junit.jar (junit:junit:4.12): No cached version available
查看>>
Win7获取管理权限修改Host文件以其他权限问题
查看>>
php 读取mssql数据时格式问题
查看>>
【转向Javascript系列】深入理解Web Worker
查看>>
右侧客服 运动案例
查看>>
T4 Editor地址
查看>>
Django 视图系统
查看>>
5.15 pymysql 模块
查看>>
篇三、开发前知识补充:Android的长度单位和屏幕分辨率,这个也是转载~~
查看>>
陶哲轩实分析 习题 13.4.8
查看>>
从有理数到实数(序)
查看>>
20145222《信息安全系统设计基础》第十周学习总结
查看>>
1月24日学习内容整理:Django的admin组件源码分析及流程
查看>>