科技行者

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

知识库

知识库 安全导航

至顶网软件频道Schema的优化和索引 - 高性能的索引策略 - 覆盖索引3

Schema的优化和索引 - 高性能的索引策略 - 覆盖索引3

  • 扫一扫
    分享文章到微信

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

Schema的优化和索引 - 高性能的索引策略 - 覆盖索引

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

关键字: Schema PHP MySQL

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

Schema的优化和索引 - 高性能的索引策略 - 覆盖索引3

 

这个索引不能覆盖这个查询有如下两条原因:

  没有索引覆盖这个查询,因为我们选择了这个表的所有列,并且没有一个索引覆盖这些列。理论上来说MySQL还能使用一个捷径:WHERE条件中有一列被索引覆盖,因此MySQL会使用索引先找到这个actor并且检查title是否匹配,之后再取整个行。

  MySQL不能在索引中执行LIKE操作符。这个受限于底层的存储引擎API。在索引的操作,这只能支持简单的比较。MySQL可以LIKE中匹配前缀,因为把它们转为简单的比较了。但是这个例子中前缀的通配符使使用索引查询变为了不可能。最终。MySQL服务器将会获取和匹配这个行的值,而不是索引的值。

  我们可以使用加索引(artist, title, prod_id)和重写查询来解决上面的问题。重写的查询如下

mysql> EXPLAIN SELECT *
    -> FROM products
    ->    JOIN (
    ->       SELECT prod_id
    ->       FROM products
    ->       WHERE actor='SEAN CARREY' AND title LIKE '%APOLLO%'
    ->    ) AS t1 ON (t1.prod_id=products.prod_id)G
*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: <derived2>
               ...omitted...
*************************** 2. row ***************************
           id: 1
  select_type: PRIMARY
        table: products
               ...omitted...
*************************** 3. row ***************************
           id: 2
  select_type: DERIVED
        table: products
         type: ref
possible_keys: ACTOR,ACTOR_2,IX_PROD_ACTOR
          key: ACTOR_2
      key_len: 52
          ref:
         rows: 11
        Extra: Using where;
Using index

 

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

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

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