mysql织梦索引优化之MySQL Order By索引优化_dedecms_CMS教程

来源:脚本之家  责任编辑:小易  

在一些情况下,MySQL可以直接使用索引来满足一个ORDER BY 或GROUP BY 子句而无需做额外的排序。尽管ORDER BY 不是和索引的顺序准确匹配,索引还是可以被用到,只要不用的索引部分和所有的额外的ORDER BY 字段在WHERE 子句中都被包括了。

使用索引的MySQL Order By

下列的几个查询都会使用索引来解决ORDER BY 或GROUP BY 部分:

SELECT * FROM t1 ORDER BY key_part1,key_part2,... ;

SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2;

SELECT * FROM t1 WHERE key_part1=constant GROUP BY key_part2;

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;

SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC;

不使用索引的MySQL Order By

在另一些情况下,MySQL无法使用索引来满足ORDER BY,尽管它会使用索引来找到记录来匹配WHERE 子句。这些情况如下:

* 对不同的索引键做ORDER BY :

SELECT * FROM t1 ORDER BY key1, key2;

* 在非连续的索引键部分上做ORDER BY:

SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;

* 同时使用了ASC 和DESC:

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

* 用于搜索记录的索引键和做ORDER BY 的不是同一个:

SELECT * FROM t1 WHERE key2=constant ORDER BY key1;

* 有很多表一起做连接,而且读取的记录中在ORDER BY 中的字段都不全是来自第一个非常数的表中(也就是说,在EXPLAIN 分析的结果中的第一个表的连接类型不是const)。

* 使用了不同的ORDER BY 和GROUP BY 表达式。

* 表索引中的记录不是按序存储。例如,HASH 和HEAP 表就是这样。

通过执行EXPLAIN SELECT ... ORDER BY,就知道MySQL是否在查询中使用了索引。如果Extra 字段的值是Using filesort,则说明MySQL无法使用索引。详情请看"7.2.1 EXPLAIN Syntax (Get Information About a SELECT)"。当必须对结果进行排序时,MySQL 4.1以前 它使用了以下filesort 算法:

1. 根据索引键读取记录,或者扫描数据表。那些无法匹配WHERE 分句的记录都会被略过。

2. 在缓冲中每条记录都用一个‘对’存储了2个值(索引键及记录指针)。缓冲的大小依据系统变量sort_buffer_size 的值而定。

3. 当缓冲慢了时,就运行qsort(快速排序)并将结果存储在临时文件中。将存储的块指针保存起来(如果所有的‘对’值都能保存在缓冲中,就无需创建临时文件了)。

4. 执行上面的操作,直到所有的记录都读取出来了。

5. 做一次多重合并,将多达MERGEBUFF(7)个区域的块保存在另一个临时文件中。重复这个操作,直到所有在第一个文件的块都放到第二个文件了。

6. 重复以上操作,直到剩余的块数量小于MERGEBUFF2 (15)。

7. 在最后一次多重合并时,只有记录的指针(排序索引键的最后部分)写到结果文件中去。

8. 通过读取结果文件中的记录指针来按序读取记录。想要优化这个操作,MySQL将记录指针读取放到一个大的块里,并且使用它来按序读取记录,将记录放到缓冲中。缓冲的大小由系统变量read_rnd_buffer_size 的值而定。这个步骤的代码在源文件`sql/records.cc' 中。

这个逼近算法的一个问题是,读取了2次记录:一次是估算WHERE 分句时,第二次是排序时。尽管第一次都成功读取记录了(例如,做了一次全表扫描),第二次是随机的读取(索引键已经排好序了,但是记录并没有)。在MySQL 4.1 及更新版本中,filesort 优化算法用于记录中不只包括索引键值和记录的位置,还包括查询中要求的字段。这么做避免了需要2次读取记录。改进的filesort 算法做法大致如下:

1. 跟以前一样,读取匹配WHERE 分句的记录。

2. 相对于每个记录,都记录了一个对应的;‘元组’信息信息,包括索引键值、记录位置、以及查询中所需要的所有字段。

3. 根据索引键对‘元组’信息进行排序。

4. 按序读取记录,不过是从已经排序过的‘元组’列表中读取记录,而非从数据表中再读取一次。

使用改进后的filesort 算法相比原来的,‘元组’比‘对’需要占用更长的空间,它们很少正好适合放在排序缓冲中(缓冲的大小是由sort_buffer_size 的值决定的)。因此,这就可能需要有更多的I/O操作,导致改进的算法更慢。为了避免使之变慢,这种优化方法只用于排序‘元组’中额外的字段的大小总和超过系统变量max_length_for_sort_data 的情况(这个变量的值设置太高的一个表象就是高磁盘负载低CPU负载)。想要提高ORDER BY 的速度,首先要看MySQL能否使用索引而非额外的排序过程。如果不能使用索引,可以试着遵循以下策略:

* 增加sort_buffer_size 的值。

* 增加read_rnd_buffer_size 的值。

* 修改tmpdir,让它指向一个有很多剩余空间的专用文件系统。

如果使用MySQL 4.1或更新,这个选项允许有多个路径用循环的格式。各个路径之间在Unix 上用冒号(':')分隔开来,在Windows,NetWare以及OS/2 上用分号(';')。可以利用这个特性将负载平均分摊给几个目录。注意:这些路径必须是分布在不同物理磁盘上的目录,而非在同一个物理磁盘上的不同目录
 


  • 本文相关:
  • 织梦dedecms安全漏洞include/common.inc.php漏洞解决方法
  • 织梦dedecms建立模型、简单分表、索引优化操作方法
  • dedecms大数据负载性能优化方案(简单几招让你提速n倍)
  • mysql织梦索引优化之mysql order by索引优化
  • 织梦dedecms页面空白后开启错误信息提示功能方便调试错误
  • 织梦dedecms 分表实现一个栏目对应一个表(图)
  • 加固版织梦cms整站源码通用安装教程
  • 织梦dedecms robots优化设置的具体方法
  • dedecms网站title标签seo优化方法
  • dedecms文章关键字(自动内链)php5.5以上版本urf-8失效的解决方法
  • MySQL索引优化的实际案例分析
  • 如何利用mysql索引优化检索
  • mysql 怎么建索引优化
  • MySQL 索引优化器选择索引的规则是什么?
  • Mysql使用索引实现查询优化
  • MySQL表设计优化与索引
  • mysql性能优化之索引优化
  • MySQL索引分析和优化
  • MySQL 索引分析和优化
  • MySQL查询优化之索引的应用详解
  • mysql 子查询 可以加索引优化吗
  • MySQL 联合索引与Where子句的优化 提高数据库运行效率
  • 如何为Mysql优化选择最佳索引
  • 探究MySQL优化器对索引和JOIN顺序的选择
  • mysql 怎么建索引,sql语句优化。sql分组语句优化,
  • mysql数据库优化讲解之索引:什么是索引
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全主页cms教程dedecmsmysqlorderby索引优化织梦dedecms安全漏洞include/common.inc.php漏洞解决方法织梦dedecms建立模型、简单分表、索引优化操作方法dedecms大数据负载性能优化方案(简单几招让你提速n倍)mysql织梦索引优化之mysql order by索引优化织梦dedecms 分表实现一个栏目对应一个表(图)加固版织梦cms整站源码通用安装教程织梦dedecms robots优化设置的具体方法dedecms网站title标签seo优化方法dedecms文章关键字(自动内链)php5.5以上版本urf-8失效的解决方法dedecmsphpcms帝国cmswordpressdiscuz动易cmsphpwind新云cms科汛cms风讯cmsucenteruchomez-blogecshopdrupal其它cms织梦dedecms 忘记管理员后台密码的解决技巧dede后台验证码不显示解决方法详解(dedecms 5.7)dedecms后台登录一片空白的解决方法dedecms标签大全(非常经典)织梦dedecms简略标题调用标签用法指南 织梦cms提示dedetag engine create file false错误的dedecms列表页调用文章正文内容的方法使用dedecms搭建自己的本地网站(全程图解)织梦dedecms设置伪静态详细方法dedecms用sql语句调用数据库任意内容方法织梦dedecms安全漏洞include/common.inc.php漏洞解决织梦dedecms建立模型、简单分表、索引优化操作方法dedecms大数据负载性能优化方案(简单几招让你提速n倍)mysql织梦索引优化之mysql order by索引优化织梦dedecms页面空白后开启错误信息提示功能方便调试织梦dedecms 分表实现一个栏目对应一个表(图)加固版织梦cms整站源码通用安装教程织梦dedecms robots优化设置的具体方法dedecms网站title标签seo优化方法dedecms文章关键字(自动内链)php5.5以上版本urf-8失效
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved