科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Schema的优化和索引 - 索引的基础 - 索引的类型 - B-Tree索引3

Schema的优化和索引 - 索引的基础 - 索引的类型 - B-Tree索引3

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Schema的优化和索引 - 索引的基础 - 索引的类型 - B-Tree索引

作者:ddvip 来源:ddvip 2009年12月23日

关键字: Schema PHP MySQL

  • 评论
  • 分享微博
  • 分享邮件

Schema的优化和索引 - 索引的基础 - 索引的类型 - B-Tree索引3

 

 可以使用B-Tree索引的查询类型

  B-Tree可以很好的用于查找所有键的值(full key value),一个键的范围(a key range),或者一个键的前缀(a key prefix)。但是这个查找仅仅适用于索引的最左边的前缀。我们前一步所讲到的索引可以适用于下面类型的查询

  匹配所有的值

  对于索引中所有的列,匹配所有键的值。举个例子,索引可以帮助你找到一个出生于1960-01-01名字叫Cuba Allen的人。

  匹配最左端的前缀

  索引可以帮助你找到last_name为Allen的所有的人。前提是,last_name必须为索引的第一个列。

  匹配一个列的前缀

  你可以匹配一个列值的第一个部分。也就是这个索引可以帮助你查找last_name的首字母为J的所有用户。前提是 last_name必须为索引的第一个列。

  匹配一个范围的值

  索引可以帮助找到last_name范围为Allen和Barrymore的所有用户。前提还是 last_name必须为索引的第一个列。

  准确匹配一部分并且匹配另一个部分的一个范围

  这个索引可以帮助你查找last_name为Allen并且first_name首字母为K的用户。这个就是精确匹配last_name以及在first_name上的一个范围查询。

  仅支持索引的语句(Index-only queries)

  B-Tree索引能支持一般的仅支持索引的语句(Index-only)。这些语句是只能通过索引来访问的语句,而不是通过行存储。以后将会详细说到。

  因为树的节点是有序的,因此它们可以用于查找和ORDER BY语句。一般来说,如果一个B-Tree能帮助使你通过特定的条件找到一个行,它也能在相同的条件下排序这些行。因此,我们的索引对于ORDER BY是有用的,当然前提是要符合我们上述所列出的查询类型。

  下面是一些B-Tree索引的限制

  1.如果查找不从索引最左边的列开始,这些索引就没用了。举个例子,当你要查找name为bill或者指定的birthday的时候,它们就没啥用处了,因为这些列都不是在索引的最左边。同样的,你也不能使用索引查找last_name列中,以指定字母结尾的用户。

  2.在索引中你不能跳过列。也就是说,你将不能查找last_name为Smith和指定的birthday。如果你不指定first_name,那么MySQL只会对第一列使用索引。

  3.存储引擎不能优化那些在首个范围条件列的右边的任意列。举个例子,如果你的查询是WHERE last_name="Smith" AND first_name LIKE 'J%' AND dob='1976-12-23‘。索引只会应用在前两个列,因为Like是个范围条件。对于有限制值数量的一个列,你可以通过指定相同条件的方法取代范围条件。在以后的索引示例中将会详细说到。

  通过上面的学习,你可以知道为什么列的顺序是如此重要了把。这些限制都是关于列的顺序的。对于一个高性能的应用。你可能需要创建相同的列但是不同顺序的一些索引来满足你的查询。

  有一些限制并不是来自于B-Tree索引的,而是由MySQL语句优化的方式和存储引擎如何使用索引所产生的。其中的一些在未来的MySQL版本中可能就不是限制了。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章