mysql5.7官网直译SQL语句优化--select语句优化
8.2 sql语句优化
大致内容如下:
8.2.1:SELECT语句的优化
8.2.2:优化子查询,派生表和试图引用
8.2.3:优化INFORMATION_SCHEMA查询
8.2.4:优化数据改变语句
8.2.5:优化数据库权限
8.2.6:其他优化建议
数据库应用的核心逻辑是完成sql语句的执行,sql语句可以直接提交或者通过API后台提交。该部分指南帮助提高各种mysql应用的执行速度。指导包括了通过sql操作的数据读写,一般sql操作的幕后开销,和特别场景下的操作指导,如数据库监控。
8.2.1 优化SELECT 语句;
大致内容包括:
1.1where条件的优化
1.2Range优化
1.3索引合并的优化
1.4Engine Condition Pushdown Optimization(引擎条件压入优化)#翻译不准确
1.5index Condition Pushdown Optimization(索引条件压入优化)#翻译不准确
1.6Nested-Loop Join Algorithms(嵌套循环连接算法)
1.7Nested Join Optimization(嵌套连接优化)
1.8左连接和右连接的优化
1.9简单化外连接
1.10多范围读取的优化
1.11Block Nested-Loop and Batched Key Access Joins(块状嵌套循环和接入批量key的连接)#翻译不准确
1.12is null优化
1.13order by 优化
1.14group by 优化
1.15DISTINCT 优化
1.16limit 查询优化
1.17函数调用优化
1.18行结构表达式优化
1.19避免全表扫描
以select语句形式的查询,在数据库中完成全部的操作。是否能够在动态页面里达到秒级响应或者是通过分时运行来生成跨夜的报告,首先要考虑的就是调整这些语句。
除了查询语句外,对于查询语句调整的技术也使用在例如CREATE TABLE ... AS SELECT,INSERT INTO ... SELECT 以及在DELETE语句中出现的where条件中。这些语句因为结合了读和写操作,所以需要额外考虑性能。
NDB集群支持一个join pushdown优化,通过把一个高效连接整体发送给NDB集群的data节点,然后可以通过分布式和并行来完成。关于更多这种优化的信息,请看Conditions for NDB pushdown joins。
主要考虑的查询优化是:
>为了使得一个慢select ... where 查询变快,第一件事就是去检查是否可以加索引。在where条件的列上加索引,可以加快评估,过滤条件,并且最终尽快查出结果。为了避免浪费磁盘空间,通过在你的应用中构建小集合的索引来加快相关查询的速度。
对于查询使用了例如joins或者是外键等特性关联多张表的查询来说,索引是特别重要的。你能够使用EXPLAIN语句来决定在查询中使用了哪些索引。具体请看8.3.1的mysql如何使用索引和8.8.1的用EXPLAIN来优化查询。
>独立并且调整查询中任何花费时间较长的部分,比方说函数调用。依赖于查询如何构造和执行,一个函数可能只是对结果集中的每行数据调用一次,或者是对表中的每行数据都调用一次,这极大的放大了查询的无效性。
>尽量减少在你查询中的全表扫描,特别是大表。
>周期性的通过ANALYZE TABLE命令来更新和保持表中的统计信息,从而为优化器提供信息来构建一个有效的执行计划。
>学习调整技术,索引技术,并且对于不同存储引擎中的每一张表配置特别的参数。不管是innoDB还是myisam,都有指南帮助维持查询的持久高效性。更多信息请看8.5.6的优化innoDB查询和8.6.1部分的优化myIsam查询。
>你可以通过使用在8.5.3中的innoDB只读事物优化的技术,对innoDB表中的简单事物查询做优化。
>避免转变查询使其变得更难理解,特别是优化器自己自动完成的一些相同转变。
>如果一个性能问题不能通过基本指导里的思路来解决,那么通过阅读EXPLAIN的信息深入的研究一下查询的内在结构,并通过调整你的索引,where条件,join条件等来解决。(如果你确定想要的是专家级别,那阅读每个查询的EXPLAIN计划也许是你第一步应该做的)
>调整mysql使用缓存的大小和内存区域的属性。通过有效的使用innoDB的缓存池,myisam的key缓存,mysql的查询缓存,重复查询能够运行的更快,因为结果已经被缓存了。
>即使是通过使用缓存,一个查询已经很快速了,但是通过进一步优化,可以使得查询占用更小的缓存大小,从而使得你的应用更稳定,高效,可扩展。高扩展性,表示你的应用在低延迟下能够处理更多的并发客户,大量的请求等。
>处理锁问题,你查询的速度被其他sessions同时在操作表的事件而影响。
到此关于查询优化的大概介绍就结束了,接下来我们将对上述列出的目录一一说明。
下一文要说的是8.2.1.1的WHERE条件的优化