Heim >Datenbank >MySQL-Tutorial >MySQL查询优化程序[组图]_MySQL

MySQL查询优化程序[组图]_MySQL

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-01 13:52:44745Durchsuche

  在发布一个选择行的查询时, MySQL进行分析,看是否能够对它进行优化,使它执行更快。本文我们将研究查询优化程序怎样工作。更详细的信息,可参阅MySQL参考指南中的“Getting Maximum Performance from MySQL”,本文描述了MySQL采用的各种优化措施。(http://www.mysql.com/ 处的MySQL联机参考指南在不断地更新。)

  MySQL查询优化程序利用了索引。当然,它也利用了其他信息。例如,如果发布下列查询,MySQL将非常快地执行它,不管相应的表有多大:

  SELECT * FROM tb1_name WHERE 1= 0

  在此情形中,MySQL考察WHERE 子句,如果认识到不可能有满足该查询的行,就不会对该表进行搜索。可利用EXPLAIN 语句知道这一点,EXPLAIN 语句要求MySQL显示某些有关它应该执行一条SELECT 查询,而实际没有执行的信息。为了使用E X P L A I N,只需要SELECT 语句前放置EXPLAIN 即可,如下所示:

EXPLAIN SELECT * FROM tb1_name WHERE 1= 0

MySQL查询优化程序[组图]_MySQL

  通常,EXPLAIN 返回的信息比这个多,包括将用来扫描表的索引、将要使用的连接类型以及需要在每个表中扫描的行数估计等等。

  1 优化程序怎样工作

  MySQL查询优化程序有几个目标,但其主要目标是尽量利用索引,而且尽量使用最具有限制性的索引以排除尽可能多的行。这样做可能会适得其反,因为发布一条SELECT 语句的目的是寻找行,而不是拒绝它们。优化程序这样工作的原因是从要考虑的行中排除行越快,那么找到确实符合给出标准的行就越快。如果能够首先进行最具限制性的测试,则查询可以进行得更快。假如有一个测试两列的查询,每列上都有一个索引:

  WHERE coll = "some value" AND col2 = "some other value"

  还假定,与col1上的测试相符的有900 行,与col2 上的测试相符的有300 行,而两个测试都通过的有30 行。如果首先测试c o l 1,必须检查900 行以找到也与col2 值相符的30 行。那么测试中有870 将失败。如果首先测试c o l 2,要找到也与col1值相符的30 行,只需检查300 行。测试中有失败270 次,这样所涉及的计算较少,磁盘I/O 也较少。遵循下列准则,有助于优化程序利用索引:

  1 比较具有相同类型的列。在比较中利用索引列时,应该使用那些类型相同的列。例如,CHAR(10) 被视为与CHAR(10) 或VARCHAR(10) 相同,但不同于CHAR(12) 和VARCHAR( 12 )。INT 与BIGINT 不同。在MySQL3.23 版以前,要求使用相同类型的列,否则列上的索引将不起作用。自3.23 版后,不严格要求这样做,但相同的列类型比不同类型提供更好的性能。如果所比较的两列类型不同,可使用ALTER TABLE语句修改其中之一使它们的类型相配。

  2  比较中应尽量使索引列独立。如果在函数调用或算术表达式中使用一个列,则MySQL不能使用这样的索引,因为它必须对每行计算表达式的值。有时,这是不可避免的,但很多时候,可以重新编写只取索引列本身的查询。下面的WHERE 子句说明了怎样进行这项工作。第一行中,优化程序将简化表达式4/2 为值2,然后使用my_col 上的索引快速地找到小于2 的值。而在第二个表达式中,MySQL必须检索出每行的my_col 值,乘以2,然后将结果与4 比较。没索引可用,因为列中的每个值都要检索,以便能对左边的表达式求值:

  WHERE my_col

  WHERE my_col * 2

  让我们考虑另一个例子。假如有一个索引列date _ c o l。如果发布如下的查询,相应的索引未被使用:

  SELECT * FROM my_tb1WHERE YEAR(date_col)

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn