竞博体育 > 前端 > 我们将讨论MySQL的查询优化程序,因为优化技术本来就并非总是简单的

我们将讨论MySQL的查询优化程序,因为优化技术本来就并非总是简单的

竞博体育官方版下载 ,MySQL查询索引的不易利用

目录是拉长查询速度的最重视的工具。当然还会有别的的黄金年代部分本领可供使用,可是日常的话引起最大品质差距的都以索引的不利选用。在MySQL邮件列表中,大家时时询问那么些让查询运营得更加快的章程。在半数以上意况下,我们理应嫌疑数据表上有未有目录,而且普通在增添索引之后随时扼杀了难题。当然,并不接二连三那样轻便就足以化解难题的,因为优化才具本来就无须总是简单的。但是,若无接受索引,在比很多动静下,你策画利用别的的办法来增加质量都以在浪费时间。首先使用索引来获取最大的性质提升,接着再看其余的技艺是或不是有用。

  那风华正茂局地呈报了目录是什么以及索引是什么升高查询质量的。它还斟酌了在一些条件中索引可能减少品质,并为你明智地选取数据表的目录提供了有的辅导计划。在下一些中咱们将商讨MySQL查询优化器,它希图找到实施查询的作用最高的法子。领会部分优化器的学识,作为对什么树立目录的补给,对大家是有益处的,因为这么你本领更加好地应用和睦所创立的目录。有些编写查询的章程其实让索引不起成效,在相近处境下您应当幸免这种状态的发生。

  目录的长处

  让大家开始明白索引是怎样行事的,首先有三个不带索引的数据表。不带索引的表仅仅是叁个冬天的多少行群集。比方,图1展现的ad表就是不带索引的表,因此只要急需索求有个别特定的集团,就非得检查表中的每一个数据行看它是不是与指标值相相配。那会促成三回完全的数码表扫描,那个进度会非常的慢,假如这一个表一点都不小,可是只包括一些些的切合条件的记录,那么作用会相当低。


图1:无索引的ad表

  图2是如出意气风发辙的一张数据表,不过扩大了对ad表的company_num数据列的目录。这么些目录包含了ad表中的每个数据行的条规,不过索引的条文是坚决守护company_num值排序的。以往,大家不是逐行查看以搜索相称的数量项,而是利用索引。借使大家索求集团13的具有数据行。大家开端扫描索引并找到了该公司的七个值。接着大家境遇了小卖部14的索引值,它比我们正在搜寻的值大。索引值是排过序的,由此当大家读取了包括14的目录记录的时候,我们就知晓再也不会有越多的特别记录,能够截至查询操作了。因而使用索引获得的效果是:咱们找到了万分的数据行在哪个地方终止,并能够忽略任何的数据行。另一个效应来自采取一定算法查找第一条相配的条规,而不必要从索引头起始推行线性扫描(举例,二分查找就比线性扫描要快一些)。通过动用这种方法,大家得以高速地定位第八个特别的值,节省了汪洋的物色时间。数据库使用了八种技巧来迅速地定位索引值,可是在本文中大家不关心这一个本领。注重是它们能够贯彻,並且索引是个好东西。


图2:索引后的ad表< 喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPC90ZD4KPC90cj4KPC90Ym9keT4KPC90YWJsZT4KPC9jZW50ZXI+CjxwIGNsYXNzPQ=="western" align="left">
  你可能要问,我们为什么不对数据行进行排序从而省掉索引?这样不是也能实现同样的搜索速度的改善吗?是的,如果表只有一个索引,这样做也可能达到相同的效果。但是你可能添加第二个索引,那么就无法一次使用两种不同方法对数据行进行排序了(例如,你可能希望在顾客名称上建立一个索引,在顾客ID号或电话号码上建立另外一个索引)。把与数据行相分离的条目作为索引解决了这个问题,允许我们创建多个索引。此外,索引中的行一般也比数据行短一些。当你插入或删除新的值的时候,移动较短的索引值比移动较长数据行的排序次序更加容易。

  不同的MySQL存储引擎的索引实现的具体细节信息是不同的。例如,对于MyISAM数据表,该表的数据行保存在一个数据文件中,索引值保存在索引文件中。一个数据表上可能有多个索引,但是它们都被存储在同一个索引文件中。索引文件中的每个索引都包含一个排序的键记录(它用于快速地访问数据文件)数组。

  与此形成对照的是,BDB和InnoDB存储引擎没有使用这种方法来分离数据行和索引值,尽管它们也把索引作为排序后的值集合进行操作。在默认情况下,BDB引擎使用单个文件存储数据和索引值。InnoDB使用单个数据表空间(tablespace),在表空间中管理所有InnoDB表的数据和索引存储。我们可以把InnoDB配置为每个表都在自己的表空间中创建,但是即使是这样,数据表的数据和索引也存储在同一个表空间文件中。
前面的讨论描述了单个表查询环境下的索引的优点,在这种情况下,通过减少对整个表的扫描,使用索引明显地提高了搜索的速度。当你运行涉及多表联结(jion)查询的时候,索引的价值就更高了。在单表查询中,你需要在每个数据列上检查的值的数量是表中数据行的数量。在多表查询中,这个数量可能大幅度上升,因为这个数量是这些表中数据行的数量所产生的。

  假设你拥有三个未索引的表t1、t2和t3,每个表都分别包含数据列i1、i2和i3,并且每个表都包含了1000条数据行,其序号从1到1000。查找某些值匹配的数据行组合的查询可能如下所示:

SELECTt1.i1, t2.i2, t3.i3
FROM t1, t2, t3
WHERE t1.i1 = t2.i2 ANDt2.i1 = t3.i3;


  这个查询的结果应该是1000行,每个数据行包含三个相等的值。如果在没有索引的情况下处理这个查询,那么如果我们不对这些表进行全部地扫描,我们是没有办法知道哪些数据行含有哪些值的。因此你必须尝试所有的组合来查找符合WHERE条件的记录。可能的组合的数量是1000x 1000 x1000(10亿!),它是匹配记录的数量的一百万倍。这就浪费了大量的工作。这个例子显示,如果没有使用索引,随着表的记录不断增长,处理这些表的联结所花费的时间增长得更快,导致性能很差。我们可以通过索引这些数据表来显著地提高速度,因为索引让查询采用如下所示的方式来处理:

  1.选择表t1中的第一行并查看该数据行的值。

  2.使用表t2上的索引,直接定位到与t1的值匹配的数据行。类似地,使用表t3上的索引,直接定位到与表t2的值匹配的数据行。

  3.处理表t1的下一行并重复前面的过程。执行这样的操作直到t1中的所有数据行都被检查过。

  在这种情况下,我们仍然对表t1执行了完整的扫描,但是我们可以在t2和t3上执行索引查找,从这些表中直接地获取数据行。理论上采用这种方式运行上面的查询会快一百万倍。当然这个例子是为了得出结论来人为建立的。然而,它解决的问题却是现实的,给没有索引的表添加索引通常会获得惊人的性能提高。

  MySQL有几种使用索引的方式:

  ·如上所述,索引被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。

  ·对于使用了MIN()或MAX()函数的查询,索引数据列中最小或最大值可以很快地找到,不用检查每个数据行。

  ·MySQL利用索引来快速地执行ORDERBY和GROUPBY语句的排序和分组操作。

  ·有时候MySQL会利用索引来读取查询得到的所有信息。假设你选择了MyISAM表中的被索引的数值列,那么就不需要从该数据表中选择其它的数据列。在这种情况下,MySQL从索引文件中读取索引值,它所得到的值与读取数据文件得到的值是相同的。没有必要两次读取相同的值,因此没有必要考虑数据文件。


 索引的代价

  一般来说,如果MySQL能够找到方法,利用索引来更快地处理查询,它就会这样做。这意味着,对于大多数情况,如果你没有对表进行索引,就会使性能受到损害。这就是我所描绘的索引优点的美景。但是它有缺点吗?有的,它在时间和空间上都有开销。在实践中,索引的优点的价值一般会超过这些缺点,但是你也应该知道到底有一些什么缺点。

  首先,索引加快了检索的速度,但是减慢了插入和删除的速度,同时还减慢了更新被索引的数据列中的值的速度。也就是说,索引减慢了大多数涉及写操作的速度。发生这种现象的原因在于写入一条记录的时候不但需要写入数据行,还需要改变所有的索引。数据表带有的索引越多,需要做出的修改就越多,平均性能的降低程度也就越大。在本文的"高效率载入数据"部分中,我们将更细致地了解这些现象并找出处理方法。

  其次,索引会花费磁盘空间,多个索引相应地花费更多的磁盘空间。这可能导致更快地到达数据表的大小限制:

  ·对于MyISAM表,频繁地索引可能引起索引文件比数据文件更快地达到最大限制。

  ·对于BDB表,它把数据和索引值一起存储在同一个文件中,添加索引引起这种表更快地达到最大文件限制。

  ·在InnoDB的共享表空间中分配的所有表都竞争使用相同的公共空间池,因此添加索引会更快地耗尽表空间中的存储。但是,与MyISAM和BDB表使用的文件不同,InnoDB共享表空间并不受操作系统的文件大小限制,因为我们可以把它配置成使用多个文件。只要有额外的磁盘空间,你就可以通过添加新组件来扩展表空间。

  使用单独表空间的InnoDB表与BDB表受到的约束是一样的,因为它的数据和索引值都存储在单个文件中。

  这些要素的实际含义是:如果你不需要使用特殊的索引帮助查询执行得更快,就不要建立索引。

  选择索引

  假设你已经知道了建立索引的语法,但是语法不会告诉你数据表应该如何索引。这要求我们考虑数据表的使用方式。这一部分指导你如何识别出用于索引的备选数据列,以及如何最好地建立索引:

  用于搜索、排序和分组的索引数据列并不仅仅是用于输出显示的。换句话说,用于索引的最好的备选数据列是那些出现在WHERE子句、join子句、ORDERBY或GROUPBY子句中的列。仅仅出现在SELECT关键字后面的输出数据列列表中的数据列不是很好的备选列:

SELECT
col_a<- 不是备选列
FROM
tbl1LEFT JOIN tbl2
ON tbl1.col_b = tbl2.col_c <-备选列
WHERE
col_d= expr; <- 备选列


  当然,显示的数据列与WHERE子句中使用的数据列也可能相同。我们的观点是输出列表中的数据列本质上不是用于索引的很好的备选列。

  Join子句或WHERE子句中类似col1=col2形式的表达式中的数据列都是特别好的索引备选列。前面显示的查询中的col_b和col_c就是这样的例子。如果MySQL能够利用联结列来优化查询,它一定会通过减少整表扫描来大幅度减少潜在的表-行组合。

  考虑数据列的基数(cardinality)。基数是数据列所包含的不同值的数量。例如,某个数据列包含值1、3、7、4、7、3,那么它的基数就是4。索引的基数相对于数据表行数较高(也就是说,列中包含很多不同的值,重复的值很少)的时候,它的工作效果最好。如果某数据列含有很多不同的年龄,索引会很快地分辨数据行。如果某个数据列用于记录性别(只有"M"和"F"两种值),那么索引的用处就不大。如果值出现的几率几乎相等,那么无论搜索哪个值都可能得到一半的数据行。在这些情况下,最好根本不要使用索引,因为查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。惯用的百分比界线是"30%"。现在查询优化器更加复杂,把其它一些因素也考虑进去了,因此这个百分比并不是MySQL决定选择使用扫描还是索引的唯一因素。

  索引较短的值。尽可能地使用较小的数据类型。例如,如果MEDIUMINT足够保存你需要存储的值,就不要使用BIGINT数据列。如果你的值不会长于25个字符,就不要使用CHAR(100)。较小的值通过几个方面改善了索引的处理速度:

  ·较短的值可以更快地进行比较,因此索引的查找速度更快了。

  ·较小的值导致较小的索引,需要更少的磁盘I/O。

  ·使用较短的键值的时候,键缓存中的索引块(block)可以保存更多的键值。MySQL可以在内存中一次保持更多的键,在不需要从磁盘读取额外的索引块的情况下,提高键值定位的可能性。

  对于InnoDB和BDB等使用聚簇索引(clusteredindex)的存储引擎来说,保持主键(primarykey)短小的优势更突出。聚簇索引中数据行和主键值存储在一起(聚簇在一起)。其它的索引都是次级索引;它们存储主键值和次级索引值。次级索引屈从主键值,它们被用于定位数据行。这暗示主键值都被复制到每个次级索引中,因此如果主键值很长,每个次级索引就需要更多的额外空间。

  索引字符串值的前缀(prefixe)。如果你需要索引一个字符串数据列,那么最好在任何适当的情况下都应该指定前缀长度。例如,如果有CHAR(200)数据列,如果前面10个或20个字符都不同,就不要索引整个数据列。索引前面10个或20个字符会节省大量的空间,并且可能使你的查询速度更快。通过索引较短的值,你可以获得那些与比较速度和磁盘I/O节省相关的好处。当然你也需要利用常识。仅仅索引某个数据列的第一个字符串可能用处不大,因为如果这样操作,那么在索引中不会有太多的唯一值。

  你可以索引CHAR、VARCHAR、BINARY、VARBINARY、BLOB和TEXT数据列的前缀。

  使用最左(leftmost)前缀。建立多列复合索引的时候,你实际上建立了MySQL可以使用的多个索引。复合索引可以作为多个索引使用,因为索引中最左边的列集合都可以用于匹配数据行。这种列集合被称为"最左前缀"(它与索引某个列的前缀不同,那种索引把某个列的前面几个字符作为索引值)。

  假设你在表的state、city和zip数据列上建立了复合索引。索引中的数据行按照state/city/zip次序排列,因此它们也会自动地按照state/city和state次序排列。这意味着,即使你在查询中只指定了state值,或者指定state和city值,MySQL也可以使用这个索引。因此,这个索引可以被用于搜索如下所示的数据列组合:

state,city, zip
state, city
state


  MySQL不能利用这个索引来搜索没有包含在最左前缀的内容。例如,如果你按照city或zip来搜索,就不会使用到这个索引。如果你搜索给定的state和具体的ZIP代码(索引的1和3列),该索引也是不能用于这种组合值的,尽管MySQL可以利用索引来查找匹配的state从而缩小搜索的范围。

  不要过多地索引。不要认为"索引越多,性能越高",不要对每个数据列都进行索引。我们在前面提到过,每个额外的索引都会花费更多的磁盘空间,并降低写操作的性能。当你修改表的内容的时候,索引就必须被更新,甚至可能重新整理。如果你的索引很少使用或永不使用,你就没有必要减小表的修改操作的速度。此外,为检索操作生成执行计划的时候,MySQL会考虑索引。建立额外的索引会给查询优化器增加更多的工作量。如果索引太多,有可能(未必)出现MySQL选择最优索引失败的情况。维护自己必须的索引可以帮助查询优化器来避免这类错误。

  如果你考虑给已经索引过的表添加索引,那么就要考虑你将增加的索引是否是已有的多列索引的最左前缀。如果是这样的,不用增加索引,因为已经有了(例如,如果你在state、city和zip上建立了索引,那么没有必要再增加state的索引)。

  让索引类型与你所执行的比较的类型相匹配。在你建立索引的时候,大多数存储引擎会选择它们将使用的索引实现。例如,InnoDB通常使用B树索引。MySQL也使用B树索引,它只在三维数据类型上使用R树索引。但是,MEMORY存储引擎支持散列索引和B树索引,并允许你选择使用哪种索引。为了选择索引类型,需要考虑在索引数据列上将执行的比较操作类型:

  ·对于散列(hash)索引,会在每个数据列值上应用散列函数。生成的结果散列值存储在索引中,并用于执行查询。散列函数实现的算法类似于为不同的输入值生成不同的散列值。使用散列值的好处是散列值比原始值的比较效率更高。散列索引用于执行=或<=>操作等精确匹配的时候速度非常快。但是对于查询一个值的范围效果就非常差了:

id< 30
weight BETWEEN 100 AND 150


  ·B树索引可以用于高效率地执行精确的或者基于范围(使用操作<、<=、=、>=、>、<>、!=和BETWEEN)的比较。B树索引也可以用于LIKE模式匹配,前提是该模式以文字串而不是通配符开头。

  如果你使用的MEMORY数据表只进行精确值查询,散列索引是很好的选择。这是MEMORY表使用的默认的索引类型,因此你不需要特意指定。如果你希望在MEMORY表上执行基于范围的比较,应该使用B树索引。为了指定这种索引类型,需要给索引定义添加USINGBTREE。例如:

CREATETABLE lookup
(
id INT NOT NULL,
name CHAR(20),
PRIMARYKEY USING BTREE (id)
) ENGINE = MEMORY;


  如果你希望执行的语句的类型允许,单个MEMORY表可以同时拥有散列索引和B树索引,即使在同一个数据列上。

  有些类型的比较不能使用索引。如果你只是通过把值传递到函数(例如STRCMP())中来执行比较操作,那么对它进行索引就没有价值。服务器必须计算出每个数据行的函数值,它会排除数据列上索引的使用。

  使用慢查询(slow-query)日志来识别执行情况较差的查询。这个日志可以帮助你找出从索引中受益的查询。你可以直接查看日志(它是文本文件),或者使用mysqldumpslow工具来统计它的内容。如果某个给定的查询多次出现在"慢查询"日志中,这就是一个线索,某个查询可能没有优化编写。你可以重新编写它,使它运行得更快。你要记住,在评估"慢查询"日志的时候,"慢"是根据实际时间测定的,在负载较大的服务器上"慢查询"日志中出现的查询会多一些。

http://www.bkjia.com/Mysql/1000477.htmlwww.bkjia.comtruehttp://www.bkjia.com/Mysql/1000477.htmlTechArticleMySQL查询索引的正确使用 索引是提高查询速度的最重要的工具。当然还有其它的一些技术可供使用,但是一般来说引起最大性能差异的都是...

关全面据库的社会风气是叁个表与聚集、表与集中上的运算占统治地位的世界。数据库是三个表的聚焦,而表又是行和列的集合。在发布一条SELECT 查询从表中实行检索行时,得到另一个行和列的联谊。这一个都以部分架空的定义,对于数据库系统用来操纵表中多少的着力代表尚无微微参照他事他说加以考查价值。另叁个抽象概念是,表上的运算都同一时间扩充;查询是风华正茂种概念性的聚合运算,並且集合论中绝非时间概念。当然,现实世界是豆蔻年华对一分裂的。数据库管理种类达成了抽象的定义,但是在实际的硬件  范围内要境遇实际的概况约束。结果是,查询要花时间,不时要花相当短的年华。而人类超轻便急躁,不赏识等待,因而我们丢下了聚众上的那几个弹指间的数学生运动算的空洞世界去寻求加快查询的形式。幸运的是,有二种加快运算的技能,可对表进行索引使数据库服务器查找行越来越快。可寻思怎么着丰盛利用这么些索引来编写查询。可编写制定影响服务器调节机制的询问,使来自三个客户机的询问合作得越来越好。大家思忖基本硬件怎么着运转,以便想出哪些征服其概略约束对质量进行校订的章程。

 那几个就是本文所要探讨的标题,其目标是优化数据库系统的习性,使其尽只怕快地管理各个查询。MySQL已经优良快了,但不怕是最快的数据库,在人的策画下仍然为能够运作得更加快。

我们将讨论MySQL的查询优化程序,因为优化技术本来就并非总是简单的。1 使用索引

作者们第黄金时代探究索引,因为它是加快查询的最重大的工具。还应该有任何加速查询的本事,然则最管用的实在恰本地使用索引了。在MySQL的邮件项目清单上,大家常常询问关于使查询更加快的主题材料。在大批量的案例中,都以因为表上没有索引,日常要是加上索引就足以立时消除问题。但这么也绝不总是实惠,因为优化并不是总是那么轻易。不过,如若不应用索引,在不菲景色下,用其余花招改过品质只会是浪费时间。应该率先考虑接收索引得到最大的特性改革,然后再寻求其余大概有赞助的本领。

本文介绍索引是何许、它什么纠正查询质量、索引在什么意况下或许会下降品质,以致如何为表选拔索引。下大器晚成节,大家将商讨MySQL的询问优化程序。除了领悟如何创设索引外,领会部分优化程序的学问也会有利润的,因为如此能够越来越好地利用所创办的目录。有些编写查询的格局其实会妨碍索引的效果与利益,应该幸免这种情景现身。(就算不用总会那样。有的时候也会期望忽视优化程序的法力。大家也将介绍这么些景况。)

1.1 索引的实惠

让大家从二个无索引的表最先来察看索引是哪些起效果的。无索引的表就是二个冬日的行集。比方,图4

  • 1交给了小编们在第1章“MySQL与SQL 介绍” 中首先旁观标ad 表。这些表上没有索引,由此风流罗曼蒂克旦大家查究有个别特定集团的行时,必得查看表中的每生龙活虎行,看它是或不是与所需的值特别。这是二个全表扫描,非常慢,借使表中唯有少数多少个记录与追寻条件相相配,则其成效是比相当的低的。

竞博体育官方版下载 1

图4 - 2提交了大器晚成致的表,但在表的company_num 列上平添了二个目录。此索引富含表中每行的意气风发项,但此索引是在company_num 上排序的。今后,无需逐行寻觅全表查找匹配的条目款项,而是能够利用索引实行检索。假设大家要探寻集团13的有所行,那么能够扫描索引,结果得出3行。然后到达集团14的行,那是一个比大家正在查找的要大的编号。索引值是排序的,因而在读到包括14的记录时,我们知道不会再有特别的笔录,能够退出了。假设找寻一个值,它在索引表中某当中间点以前不会产出,那么也是有找到其首先个相配索引项的固定算法,而不用进行表的风流倜傥一扫描(如二分查找法)。那样,能够飞速牢固到第贰个极度的值,以节约多量搜求时间。数据库利用了琳琅满指标全速定位索引值的本事,这么些技艺是何等并不重要,首要的是它们专门的职业寻常化,索引技能是个好东西。

有人会问,为啥不只对数据文件进行排序,省掉索引文件?那样不也在寻觅时发生雷同的效果啊?问得好,假若唯有单个索引时,是如此的。可是有望会用到第三个目录,但与此同偶尔间以二种分化的点子对同叁个数据文件实行排序是超小概的。(如,想要叁个客户名的目录,同一时候又要两个买主ID 号或电话号码的目录。)将引得文件作为三个与数据文件独立的实体就解决了这一个难点,而且允许成立八个目录。别的,索引中的行经常要比数据文件中的行短。在插入或删除值时,为维持排序依次而活动非常的短的索引值与移动较长的数据行比较越发轻便。

竞博体育官方版下载 2

其后生可畏例子与MySQL索引表的情势切合。表的多寡行保存在数据文件中,而索引值保存在目录文件中。七个表上可有不唯有叁个目录;如若实在有不断叁个索引,它们都封存在同贰个索引文件中。索引文件中的种种索引由排过序的用来飞快访谈数据文件的键记录数组构成。

眼前的座谈描述了单表查询中索引的低价,在那之中使用索引排除了全表扫描,比极大地加快了搜索的快慢。在实行涉及八个表的接连查询时,索引以致会更有价值。在单个表的询问中,每列必要查阅的值的数码就是表中央银行的数额。而在多少个表的询问中,只怕的整合数目宏大,因为那一个数据为各表中行数之积。

设若有三个未索引的表t 1、t 2、t 3,分别只包涵列c 1、c 2、c 3,每种表分别由含有数值1到1000 的1000 行组成。查找对应值相等的表行组合的询问如下所示:
    SELECT c1,c2,c3
    FROM t1,t2,t3
    WHERE c1=c2 AND c1=c3

此询问的结果应当为1000 行,各类组合包括3 个万分的值。借使大家在无索引的图景下管理此询问,则不大概理解怎么样行富含那多少个值。因而,必需找寻出装有组成以便得出与WHERE 子句相配的那三个结合。大概的咬合数目为10 0 0×10 0 0×10 0 0(十亿),比相配数目多一百万倍。超级多专门的学问都浪费了,并且那一个查询将会要命慢,尽管在如像MySQL那样快的数据库中奉行也会超级慢。而那依旧各样表中唯有1000 行的意况。如若各种表中有第一百货公司万行时,将会怎样?很扎眼,那样将会产生质量极为低下的结果。假诺对各类表举行索引,就会大幅地加快查询进程,因为使用索引的查询管理如下:

    1卡塔尔国 如下从表t第11中学精选第黄金时代行,查看此行所包涵的值。
    2卡塔尔 使用表t2 上的目录,直接跳到t2中与来自t1的值卓绝的行。相同,利用表t3 上的目录,直接跳到t3 中与来自t1的值十分的行。
    3卡塔尔(英语:State of Qatar)进到表t1的下意气风发行并再次前边的长河直到t1中装有的行已经查过。在那景况下,我们依然对表t1实施了七个全然扫描,但能够在表t2 和t3 上开展索引查找直接抽出那些表中的行。从道理上说,那时的询问比未用索引时要快一百万倍。如上所述,MySQL利用索引加快了WHERE 子句中与标准合作的行的搜寻,或许说在实践连接时加快了与其他表中的行相配的行的追寻。它也选择索引来校勘别的操作的属性:

    ■ 在接收MIN( 卡塔尔国 和MAX( 卡塔尔 函数时,能够急迅找到索引列的渺小或最大值。
    ■ MySQL平日能够使用索引来产生OTiggoDETucson BY 子句的排序操作。
    ■ 一时,MySQL可幸免对一切数据文件的读取。若是从三个索引数值列中甄选值,而且不接收表中别的列。那时候,通过对索引值的读取,就早就获得了读取数据文件所要得到的值。未有对相符的值举行四次读取的必备,由此,以致不必要涉及数据文件。

 

  • 首页
  • 电话
  • 软件