欢迎来到天天文库
浏览记录
ID:22952267
大小:64.50 KB
页数:9页
时间:2018-11-02
《mysql数据库优化(三)--》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、MySQL数据库优化(三)>> 1.估算查询性能 在大多数情况下,可以通过统计磁盘搜索次数来估算查询的性能。对小表来说,通常情况下只需要搜索一次磁盘就能找到对应的记录(因为索引可能已经缓存起来了)。对大表来说,大致可以这么估算,它使用B树做索引,想要找到一条记录大概需要搜索的次数为:log(roediuminteger)的表来说,根据上面的公式计算得到需要做log(500,000)/log(1024/3*2/(3+4))+1=4次搜索。 这个表的索引大概需要500,000*7*3/2=5.2MB的存储空间(假定典型的索引缓冲区的2/3),因此应该会有更多的索引在内存中,并且可能只需要
2、1到2次调用就能找到对应的记录。 对于写来说,大概需要4次(甚至更多)搜索才能找到新的索引位置,更新记录时通常需要2次搜索。 请注意,前面的讨论中并没有提到应用程序的性能会因为logN的值越大而下降。只要所有的东西都能由操作系统或者SQL服务器缓存起来,那么性能只会因为数据表越大而稍微下降。当数据越来越大之后,就不能全部放到缓存中去了,就会越来越慢了,除非应用程序是被磁盘搜索约束的(它跟随着的logN值增加而增加)。为了避免这种情况,可以在数据量增大以后也随着增大索引缓存容量。对MyISAM类型表来说,索引缓存容量是由系统变量key_buffer_size控制的。 2.SELECT查
3、询的速度 通常情况下,想要让一个比较慢的SELECT...yISAM表查询速度的忠告: 想要让MySQL将查询优化的速度更快些,可以在数据表已经加载完全部数据后执行行ANALYZETABLE或运行myisamchk--analyze命令。它更新了每个索引部分的值,这个值意味着相同记录的平均值(对于唯一索引来说,这个值则一直都是1)。MySQL就会在当你使用基于一个非恒量表达式的两表连接时,根据这个值来决定使用哪个索引。想要查看结果,可以在分析完数据表后运行SHOtbl_name查看Cardinality字段的值。myisamchk--description--verbose显示了索引的
4、分布信息。 想要根据一个索引来排序数据,可以运行myisamchk--sort-index--sort-records=1(如果想要在索引1上做排序)。这对于有一个唯一索引并且想根据这个索引的顺序依次读取记录的话来说是一个提高查询速度的好办法。不过要注意的是,第一次在一个大表上做排序的话将会耗费很长时间。 3.MySQL如何优化ySQL优化的工作还在继续,因此本章节还没结束。MySQL做了很多优化工作,而不仅仅是文档中提到的这些。 MySQL的一些优化做法如下: 去除不必要的括号: ((aANDb)ANDcOR(((aANDb)AND(cANDd)))) ->(aANDb
5、ANDc)OR(aANDbANDcANDd) 展开常量: (a ->b>5ANDb=cANDa=5 去除常量条件(在展开常量时需要): (B>=5ANDB=5)OR(B=6AND5=5)OR(B=7AND5=6) ->B=5ORB=6 常量表达示在索引中只计算一次 在单独一个表上做COUNT(*)而不使用yISAM和HEAP表就会直接从表信息中检索结果。在单独一个表上做任何表NOTNULL达式查询时也是这样做。 预先探测无效的常量表达式。MySQL会快速探测一些不可能的SELECT语句并且不返回任何记录。 当没用GROUPBY或分组函数时,HAV
6、ING和IN()等也是如此)。 为表连接中的每个表构造一个简洁的ARYKEY的tt1,t2 ySQL会进各种可能找到表连接最好的连接方法。如果在ORDERBY和GROUPBY子句中的所有字段都来自同一个表的话,那么在连接时这个表就会优先处理。 如果有ORDERBY子句和一个不同的GROUPBY子句,或者如果ORDERBY或GROUPBY中的字段都来自其他的表而非连接顺序中的第一个表的话,就会创建一个临时表了。 如果使用SQL_SMALL123下一页>>>>这篇文章来自..,。_RESULT,MySQL就会使用内存临时表了。 所有的表索引都会查询,最好的情况就是所有的索引都会被用到
7、,除非优化程序认为全表扫描的效率更高。同时,数据表扫描是基于判断最好的索引范围超过数据表的30%。现在,优化程序复杂多了,它基于对一些附加因素的估计,例如表大小,记录总数,I/O块大小,因此就不能根据一个固定的百分比来决定是选择使用索引还是直接扫描数据表。 在某些情况下,MySQL可以直接从索引中取得记录而无需查询数据文件。如果所有在索引中使用的字段都是数字类型的话,只需要用索引树就能完成查询。 每条记录输出之前,那
此文档下载收益归作者所有