mysql数据库优化(四)--

mysql数据库优化(四)--

ID:22371721

大小:70.00 KB

页数:12页

时间:2018-10-28

mysql数据库优化(四)--_第1页
mysql数据库优化(四)--_第2页
mysql数据库优化(四)--_第3页
mysql数据库优化(四)--_第4页
mysql数据库优化(四)--_第5页
资源描述:

《mysql数据库优化(四)--》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、MySQL数据库优化(四)>>  1MySQL如何优化ORDERBY  在一些情况下,MySQL可以直接使用索引来满足一个ORDERBY或GROUPBY子句而无需做额外的排序。  尽管ORDERBY不是和索引的顺序准确匹配,索引还是可以被用到,只要不用的索引部分和所有的额外的ORDERBY字段在t1ORDERBYkey_part1,key_part2,...;  SELECT*FROMt1t1t1ORDERBYkey_part1DESC,key_part2DESC;  SELECT*FROMt1  ySQL无法使用索引来满足ORDERBY,尽管它会使用索引来找到记录来匹配t1ORDE

2、RBYkey1,key2;  在非连续的索引键部分上做ORDERBY:  SELECT*FROMt1t1ORDERBYkey_part1DESC,key_part2ASC;  用于搜索记录的索引键和做ORDERBY的不是同一个:  SELECT*FROMt1ySQL是否在查询中使用了索引。如果Extra字段的值是Usingfilesort,则说明MySQL无法使用索引。当必须对结果进行排序时,MySQL4.1以前它使用了以下filesort算法:  根据索引键读取记录,或者扫描数据表。那些无法匹配ERGEBUFF(7)个区域的块保存在另一个临时文件中。重复这个操作,直到所有在第一个文

3、件的块都放到第二个文件了。  重复以上操作,直到剩余的块数量小于MERGEBUFF2(15)。  在最后一次多重合并时,只有记录的指针(排序索引键的最后部分)写到结果文件中去。  通过读取结果文件中的记录指针来按序读取记录。想要优化这个操作,MySQL将记录指针读取放到一个大的块里,并且使用它来按序读取记录,将记录放到缓冲中。缓冲的大小由系统变量read_rnd_buffer_size的值而定。这个步骤的代码在源文件`sql/records.cc'中。  这个逼近算法的一个问题是,数据库读取了2次记录:一次是估算ySQL4.1及更新版本中,filesort优化算法用于记录中不

4、只包括索引键值和记录的位置,还包括查询中要求的字段。这么做避免了需要2次读取记录。改进的filesort算法做法大致如下:  跟以前一样,读取匹配ySQL能否使用索引而非额外的排序过程。如果不能使用索引,可以试着遵循以下策略:  增加sort_buffer_size的值。  增加read_rnd_buffer_size的值。  修改tmpdir,让它指向一个有很多剩余空间的专用文件系统。如果使用MySQL4.1或更新,这个选项允许有多个路径用循环的格式。各个路径之间在Unix上用冒号(':')分隔开来,在Windows,NetWare以及OS/2上用分号(1234下一

5、页>>>>这篇文章来自..,。';')。可以利用这个特性将负载平均分摊给几个目录。注意:这些路径必须是分布在不同物理磁盘上的目录,而非在同一个物理磁盘上的不同目录。  默认情况下,MySQL也会对所有的GROUPBYcol1,col2,...查询做排序,跟ORDERBYcol1,col2,...查询一样。如果显式地包含一个有同样字段列表的ORDERBY分句,MySQL优化它的时候并不会损失速度,因为排序总是会发生。如果一个查询中包括GROUPBY,但是想要避免对结果排序的开销,可以通过使用ORDERBYNULL来取消排序。例如:  2MySQL如何优化LIMIT  在

6、一些情况下,MySQL在碰到一个使用LIMITroizesySQL认为使用索引键需要大量查找,还不如全表扫描来得更快。  对于小表来说,全表扫描通常更合适。但是对大表来说,尝试使用以下技术来避免让优化程序错误地选择全表扫描:  执行ANALYZETABLEtbl_name更新要扫描的表的索引键分布。  使用FORCEINDEX告诉MySQL,做全表扫描的话会比利用给定的索引更浪费资源。  SELECT*FROMt1,t2FORCEINDEX(index_for_column)  yISAM而言,可以在SELECT语句正在运行时插入记录,只要这时候没有正在删除记录。  想要将一个文本文

7、件加载到数据表中,可以使用LOADDATAINFILE。这通常是使用大量INSERT语句的20倍。  通过一些额外的工作,就可能让LOADDATAINFILE在数据表有大量索引的情况下运行的更快。步骤如下:  用CREATETABLE随便创建一个表。  执行FLUSHTABLES语句或mysqladminflush-tables命令。  执行myisamchk--keys-used=0-rq/path/to/db/tbl_name命令,删掉数据表的所有索引

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。