mysql 海量数据库的查询优化及分页算法方案
文章分类:数据库
转自链接: http://www.111cn.cn/database/
110/256c64abb774f5680a270b456166f795.htm
select * from table1 where name=‘zhangsan‘ and tID > 10000
和执行:
select * from table1 where tID > 10000 and name=‘zhangsan‘
一些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个
语句的确是不一样,如果 tID 是一个聚合索引,那么后一句仅仅从表的 10000 条以后的记录
中查找就行了;而前一句则要先从全表中查找看有几个 name=‘zhangsan‘的,而后再根
据限制条件条件 tID>10000 来提出查询结果。
事实上,这样的担心是不必要的。SQL SERVER 中有一个“查询分析优化器”,它可以计算出
where 子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自
动优化。
虽然查询优化器可以根据 where 子句自动的进行查询优化,但大家仍然有必要了解一下“查
询优化器”的工作原理,如非这样,有时查询优化器就会不按照您的本意进行快速查询。
在查询分析阶段,查询优化器查看查询的每个阶段并决定限制需要扫描的数据量是否有用。
如果一个阶段可以被用作一个扫描参数(SARG),那么就称之为可优化的,并且可以利用索
引快速获得所需数据。
SARG 的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围
内的匹配或者两个以上条件的 AND 连接。形式如下:
列名 操作符 <常数 或 变量>
或
<常数 或 变量> 操作符列名
列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如:
Name=’张三’
价格>5000
5000<价格
Name=’张三’ and 价格>5000
如果一个表达式不能满足 SARG 的形式,那它就无法限制搜索的范围了,也就是 SQL
SERVER 必须对每一行都判断它是否满足 Where 子句中的所有条件。所以一个索引对于
不满足 SARG 形式的表达式来说是无用的。
介绍完 SARG 后,我们来总结一下使用 SARG 以及在实践中遇到的和某些资料上结论不同
的经验:
1、Like 语句是否属于 SARG 取决于所使用的通配符的类型
如:name like ‘张%’ ,这就属于 SARG