优化SQL语句
- 使用半联接转换优化 IN 和 EXISTS 子查询
- MySQL查询优化器有多种策略可用于评估子查询:对于具有使用子查询IN,= ANY或EXISTS谓词,优化器具有以下选择:半连接物化EXISTS战略对于一个使用子查询NOT IN,<> ALL或NOT EXISTS谓语,优化有以下选择:物化EXISTS战略对于派生表,优化器具有以下选择(
- 通过设置 materialization 优化子查询
- 优化器使用实现来启用更有效的子查询处理。实例化通常通过在内存中生成子查询结果作为临时表来加快查询执行速度。MySQL第一次需要子查询结果时,将其结果化为临时表。任何随后的需要结果的时间,MySQL都会再次引用临时表。优化器可以使用哈希索引对表进行索引,以使查找快速,廉价。索引包含唯一值,以消除重复项
- 使用 EXISTS 策略优化子查询
- 某些优化适用于使用IN(或=ANY)运算符测试子查询结果的比较。本节讨论这些优化,尤其是关于NULL价值所面临的挑战。讨论的最后部分提出了如何帮助优化器的建议。考虑以下子查询比较:outer_expr IN(SELECT inner_expr FROM...WHERE subquery_where)
- 通过合并优化派生表、视图引用和公用表表达式
- 优化器可以使用两种策略来处理派生表引用(这也适用于视图引用和公用表表达式):将派生表合并到外部查询块中将派生表具体化为内部临时表范例1:SELECT*FROM(SELECT*FROM t1)AS derived_t1;通过合并派生表derived_t1,该查询的执行类似于:SELECT*FROM t
- 优化 INFORMATION_SCHEMA 查询
- 监视数据库的应用程序可能会频繁使用INFORMATION_SCHEMA表。若要最有效地编写这些表的查询,请使用以下常规准则:尝试仅查询INFORMATION_SCHEMA作为数据字典表视图的表。尝试仅查询静态元数据。选择列或对动态元数据和静态元数据使用检索条件会增加处理动态元数据的开销。注意INFO
- 优化性能模式查询
- 监视数据库的应用程序可能会频繁使用Performance Schema表。要最有效地为这些表编写查询,请利用它们的索引。例如,包括一个WHERE子句,该子句基于与索引列中的特定值的比较来限制检索到的行。大多数性能模式表都有索引。那些不是通常包含很少行或不太可能频繁查询的表。通过性能架构索引,优化程序
- 优化数据更改语句(insert、update、delete)
- 这部分解释了如何加快数据更改语句:INSERT,UPDATE,和DELETE。传统的OLTP应用程序和现代Web应用程序通常会执行许多小数据更改操作,而这些操作对并发至关重要。数据分析和报告应用程序通常运行会同时影响许多行的数据更改操作,其中主要考虑因素是I / O以写入大量数据并保持索引为最新。为
- 其他优化技巧
- 优化数据库特权权限设置越复杂,所有SQL语句的开销就越大。简化由GRANT语句建立的特权可使MySQL减少客户端执行语句时的权限检查开销。例如,如果您不授予任何表级或列级特权,则服务器无需检查tables_priv和columns_priv表的内容。同样,如果您没有对任何帐户设置资源限制,则服务器不