位置:海鸟网 > IT > mySQL >

MySQL 查询优化器的使用

查询引擎总是不能正确理解你的查询意图吗?害怕的错误的时机提出错误的问题吗? Susan S. Harkins 告诉我们怎样用 MySQL 的查询优化器提高你的交流技能。

大多数查询引擎提供了查询简化的功能,其目的就是使得查询比原始输入更加高效。MySQL 查询优化器极大的发挥了这种功能,为了在丝毫不改变原始目标的前提下尽量简化查询,优化器对查询进行分析有时甚至重新描述。

按照效率最高的原则,MySQL 查询优化器启用了一到两条强调规则。查询优化器的最主要的逻辑思想是尽多尽早的去掉一些行。这听起来有悖于查询的目标,查询的确就是为了选出记录,但这个逻辑却并没有错。开始时优化器去掉的行越多,需要查询按照附加规则去估值的行就越少。需要与规则进行比较的行数越少,查询就能越快的完成任务。举个例子,假设一个SELECT查询使用 WHERE 语法规定了两个条件:

WHERE col1 = 条件A AND col2 = 条件B

现在,假设1,000行符合条件A而只有250行符合条件B。而且,只有5条记录同时符合上述两个条件。优化器选择的是最小障碍路径:250行匹配。原因很明显:这样只需要对符合条件B的250条记录进行估值来找到同时符合两个条件的记录。如果优化器起初选择符合条件A的1000条记录,MySQL就得对这1000条记录进行估值,来找到同时符合两个条件的记录。MySQL使用索引来确定到底哪个条件提供了最快捷的路径

索引

简单说来,索引就是指向数据文件中实际记录的指针。索引包含了值对应了表中每一个值,但是 MySQL 是按照顺序存储索引值的。例如,在表employee中,你可能对字段 EmployeeNumber 进行索引。不管你怎样整理表employee,索引值始终按照EmployeeNumber进行排序。

现在假设在表中查找编号为24的雇员。MySQL对表进行搜索并在索引值为25处停止。优化器知道,索引值超过25就不会再有更多指针符合查找规则。

现在,为了能够理解下面的叙述,需要定义几个必须知道的索引术语: 单列索引只考虑一列的值。
多列索引考虑一列以上的值。
左端前缀索引是充当索引的左端列的集合。

前两个顾名思义;第三个复杂一些。多列索引有可能充当几个前缀,这是因为索引中任意从最左边开始的连续列,都可用来匹配数值。例如,假设有一个三列索引,其列名如下:LastName, FirstName,和Title。除了原来的索引,还可能有两个以上索引:
LastName, FirstName
LastName

定义前缀索引有两个基本规则: