MySQL笔记(查询优化续1)

在MYSQL中,提供给优化器使用的统计数据是由存储引擎提供,例如表或索引的页面数量、键和行的长度等信息。

由优化器产生的执行计划是一个树形结构,用于指导执行引擎产生结果,其结构为一个左深度树.

如:

join

join tbl4

join tbl3

tbl1 tbl2

MYSQL联接优化器是优化器中最重要的部分,决定了多表查询的最佳执行顺序。MYSQL使用循环嵌套的方式来进行联接操作,具体来说,就是总是尝试对当前表的一行,去找到联接表的匹配行,回溯,然后继续下一行匹配。这样,不同的联接顺序将产生不同的开销。

当然,优化器有时不一定会得到更优的方案,可以使用STRAIGHT_JOIN参数强制按照查询中表的联接顺序来执行查询。

当有很多表进行联接的时,组合方案将急速上升,当表的数量超过optimizer_search_dpth时,MySQL会采用一些快速的搜索策略(具体需要分析源代码),有的查询不能被重新排序(如 LEFT JOIN),联接优化器也会利用这些客观情况,减小搜索空间。

排序优化

MySQL可以利用索引来加快排序,但当没有索引时,则需要自己对结果进行排序

当待排序数据数量和排序缓存大小相当,则在内存内利用快速排序进行排序;

否则,就在磁盘上对数据进行分块,对每块数据进行快速排序,然后进行合并

两种文件排序方法:

双路排序——先读取行和执行order by的列,进行排序后,再次扫描表,读取对应行。

单路排序——直接读取查询需要的所有列,进行排序后输出特定列。

在排序联接的时候。若orderby的第一个表,则先对该表进行排序。然后处理联接,否则,先将联接结果保存到临时表中,然后对临时表进行排序。

执行结果发送

服务器增量的产生和发送结果,当处理完所有表,并产生一行输出开始,就会把结果发送到客户端。如果查询是可缓存的,还会在服务器端进行缓存

你可能感兴趣的:(mysql)