MySQL查询优化器的使用查询引擎总是不能正确理解你的查询意图吗?害怕的错误的时机提出错误的问题吗?。大多数查询引擎提供了查询简化的功能,其目的就是使得查询比原始输入更加高效。MySQL查询优化器极大的发挥了这种功能,为了在丝毫不改变原始目标的前提下尽量简化查询,优化器对查询进行分析有时甚至重新描述。按照效率最高的原则,MySQL查询优化器启用了一到两条强调规则。查询优化器的最主要的逻辑思想是尽多尽早的去掉一些行。这听起来有悖于查询的目标,查询的确就是为了选出记录,但这个逻辑却并没有错。开始时优化器去掉的行越多,需要查询按照附加规则去估值的行就越少。需要与规则进行比较的行数越少,查询就能越快的完成任务。举个例子,假设一个SELECT查询使用WHERE语法规定了两个条件:WHEREcol1=条件AANDcol2=条件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,FirstNameLastName定义前缀索引有两个基本规则:索引必须包含最左边的一列,所以以下不是索引FirstNameTitleFirstName,Title索引不能跳过某些列,所以以下也不是索引:LastName,Title现在,你可能对其重要性并没有充分认识。当WHERE语法扩展到多列索引上,尽可能的使用靠近左边的前缀。否则优化器可能根本就不使用索引,而性能也大打折扣。帮助优化器好的性能依赖于使用存在的索引。要保证优化器使用索引,请您遵循以下步骤:使用列本身,而不使用引用列的函数和表达式。避免在查询串的开头使用通配符。只比较相同类型的列。在Where语法中包含所有AND操作符。列本身在运行一个查询的时候,使用函数或者表达式引用列会导致索引暂时顺序混乱。如果函数或者表达式引用了一列,MySQL必须按照函数或者表达式估算每一个值,然后再把结
MySQL 查询优化器的使用 来自淘豆网m.daumloan.com转载请标明出处.