mysql 松散的索引扫描(Loose index scan)

 更新时间:2016年05月29日 23:45:32   投稿:mdxy-dxy  
今天读《High Performance MySQL》,发现一个“Loose index scan”,之前完全没有听说过。网上查了些资料,这个叫松散的索引扫描(Loose index scan)

优化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() 函数的参数例外。

相关文章

  • mysql 8.0.11压缩包版本安装教程

    mysql 8.0.11压缩包版本安装教程

    这篇文章主要为大家详细介绍了mysql 8.0.11压缩包版本安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • MYSQL数据库中的现有表增加新字段(列)

    MYSQL数据库中的现有表增加新字段(列)

    MYSQL 增加新字段的sql语句,需要的朋友可以参考下。
    2010-05-05
  • mysql查看锁表及杀进程问题

    mysql查看锁表及杀进程问题

    这篇文章主要介绍了mysql查看锁表及杀进程问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • mysql事务详细介绍

    mysql事务详细介绍

    大家好,本篇文章主要讲的是mysql事务详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览<BR>
    2021-12-12
  • MySQ索引操作命令总结(创建、重建、查询和删除索引命令详解)

    MySQ索引操作命令总结(创建、重建、查询和删除索引命令详解)

    本篇文章主要是对MySQL索引操作方法做了一下总结,包括创建索引、重建索引、查询索引、删除索引的操作
    2014-04-04
  • MySQL使用聚合函数进行单表查询

    MySQL使用聚合函数进行单表查询

    这篇文章主要介绍了MySQL使用聚合函数进行单表查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Mysql修改字段类型、长度及添加删除列实例代码

    Mysql修改字段类型、长度及添加删除列实例代码

    在MySQL中可以使用ALTER TABLE语句来修改表结构,包括添加自增属性,下面这篇文章主要给大家介绍了关于Mysql修改字段类型、长度及添加删除列的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • MAC下mysql安装配置方法图文教程

    MAC下mysql安装配置方法图文教程

    这篇文章主要为大家分享了MAC下mysql安装配置方法图文教程,感兴趣的朋友可以参考一下
    2016-06-06
  • 手把手教你MySQL运算符

    手把手教你MySQL运算符

    运算符是告诉MySQL执行特定算数或逻辑操作的符号,下面这篇文章主要给大家介绍了关于MySQL运算符的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • mysql函数之截取字符串的实现

    mysql函数之截取字符串的实现

    本文主要介绍了mysql函数之截取字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08

最新评论