mysql松散的索引扫描(Looseindexscan)
查看mysql索引优化Group By最有效的办法是当可以直接使⽤索引来完全获取需要group的字段。使⽤这个访问⽅法时,MySQL使⽤对关键字排序的索引的类型(⽐如BTREE索引)。这使得索引中⽤于group的字段不必完全涵盖WHERE条件中索引对应的key。由于只包含索引中关键字的⼀部分,因此称为松散的索引扫描。
历史上MySQL不能做松散的索引扫描,这种⽅式可以扫描索引的⾮连续部分,假定下⾯的例⼦中,在列(a,b)上有⼀索引,要运⾏下⾯的查询:
mysql> SELECT … FROM tbl WHERE b BETWEEN 2 AND 3;
因为索引从列a开始,但是WHERE没制定列a,MySQL将做全表扫描来消除不匹配的⾏。
很希望有快的⽅式来执⾏查询。某些索引结构(不是MySQL)让你定位到每个范围的开始,扫描到范围结束,然后跳到下⼀范围的开始。
这当然是相对简单的例⼦,也可以很容易通过再加⼀个不同的索引来达到⽬的。实际上,很多时候添加另⼀个索引不⼀定能解决问题。⼀个例⼦是某些查询在索引的第⼀个列上有范围条件在第⼆个列上有等价条件。
从MySQL 5.0 开始,松散索引扫描在⼀定条件是可能的,⽐如在分组查询中到最⼤和最⼩值:
mysql> EXPLAIN SELECT actor_id, MAX(film_id)
-> FROM sakila.film_actor
-> GROUP BY actor_idG
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: film_actor
type: range
possible_keys: NULL
key: PRIMARY
key_len: 2
ref: NULL
rows: 396
Extra: Using index for group-by
在下⾯⼀些情况下是可以使⽤松散索引扫描的:
• 查询针对⼀个单表。
• GROUP BY包括索引的第1个连续部分(如果对于GROUP BY,查询有⼀个DISTINCT⼦句,则所有DISTINCT的属性指向索引开头)。
• 只使⽤累积函数(如果有)MIN()和MAX(),并且它们均指向相同的列。
• 索引的任何其它部分(除了那些来⾃查询中引⽤的GROUP BY)必须为常数(也就是说,必须按常量数量来引⽤它们),但MIN()或MAX() 函数的参数例外。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论