资源描述:
《mysql海量数据库的查询优化及分页算法方案》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、mysql海量数据库的查询优化及分页算法方案文章分类:数据库转自链接: http://www.111cn.cn/database/110/256c64abb774f5680a270b456166f795.htm select*fromtable1wherename=‘zhangsan‘andtID>10000和执行:select*fromtable1wheretID>10000andname=‘zhangsan‘一些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚合索引,那么后一句仅仅从表的10000条以后
2、的记录中查找就行了;而前一句则要先从全表中查找看有几个name=‘zhangsan‘的,而后再根据限制条件条件tID>10000来提出查询结果。事实上,这样的担心是不必要的。SQLSERVER中有一个“查询分析优化器”,它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。虽然查询优化器可以根据where子句自动的进行查询优化,但大家仍然有必要了解一下“查询优化器”的工作原理,如非这样,有时查询优化器就会不按照您的本意进行快速查询。在查询分析阶段,查询优化器查看查询的每个阶段并决定限制需要扫描的数据量是否有用。如果一个阶
3、段可以被用作一个扫描参数(SARG),那么就称之为可优化的,并且可以利用索引快速获得所需数据。SARG的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。形式如下:列名操作符<常数或变量>或<常数或变量>操作符列名列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如:Name=’张三’价格>50005000<价格Name=’张三’and价格>5000如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,也就是SQLSERVER必须对每一行都判断它是否满足Where子句中的所有条件。所以一
4、个索引对于不满足SARG形式的表达式来说是无用的。介绍完SARG后,我们来总结一下使用SARG以及在实践中遇到的和某些资料上结论不同的经验:1、Like语句是否属于SARG取决于所使用的通配符的类型如:namelike‘张%’,这就属于SARG而:namelike‘%张’,就不属于SARG。原因是通配符%在字符串的开通使得索引无法使用。2、or会引起全表扫描Name=’张三’and价格>5000符号SARG,而:Name=’张三’or价格>5000则不符合SARG。使用or会引起全表扫描。3、非操作符、函数引起的不满足SARG形式的语句不满足SARG形式的语句最典型的情
5、况就是包括非操作符的语句,如:NOT、!=、<>、!<、!>、NOTEXISTS、NOTIN、NOTLIKE等,另外还有函数。下面就是几个不满足SARG形式的例子:ABS(价格)<5000Namelike‘%三’有些表达式,如:Where价格*2>5000SQLSERVER也会认为是SARG,SQLSERVER会将此式转化为:Where价格>2500/2但我们不推荐这样使用,因为有时SQLSERVER不能保证这种转化与原始表达式是完全等价的。4、IN的作用相当与OR语句:Select*fromtable1wheretidin(2,3)和Select*fromtable1
6、wheretid=2ortid=3是一样的,都会引起全表扫描,如果tid上有索引,其索引也会失效。5、尽量少用NOT6、exists和in的执行效率是一样的很多资料上都显示说,exists要比in的执行效率要高,同时应尽可能的用notexists来代替notin。但事实上,我试验了一下,发现二者无论是前面带不带not,二者之间的执行效率都是一样的。因为涉及子查询,我们试验这次用SQLSERVER自带的pubs数据库。运行前我们可以把SQLSERVER的statisticsI/O状态打开。(1)selecttitle,pricefromtitleswheretitle_i
7、din(selecttitle_idfromsaleswhereqty>30)该句的执行结果为:表‘sales‘。扫描计数18,逻辑读56次,物理读0次,预读0次。表‘titles‘。扫描计数1,逻辑读2次,物理读0次,预读0次。(2)selecttitle,pricefromtitleswhereexists(select*fromsaleswheresales.title_id=titles.title_idandqty>30)第二句的执行结果为:表‘sales‘。扫描计数18,逻辑读56次,物理读0次,预读0次。表‘titles‘。