代码之家  ›  专栏  ›  技术社区  ›  Theodore R. Smith

在MySQL中,如果foo被索引,那么放入selectfoo会提高性能吗?

  •  4
  • Theodore R. Smith  · 技术社区  · 15 年前

    RedditMirror.cc

    在我职业生涯的早期,有人指导我 应该编入索引的列是

    1. 将来将在何处执行或加入选择/更新,
    2. 需要它们是唯一的数据。

    因此,grabbestites只有一个索引键(除了主键):categoryID,但是查询了8列。

    该网站收到了惊人的突发流量,有时超过10万独特的访客一天,数据库成为“税”约20%的使用。

    在MySQL中,向所有8个经常查询的列添加索引会有性能优势吗??


    编辑:查询是:

      SELECT url, 
             title, 
             published, 
             reddit_key, 
             UNIX_TIMESTAMP(last_fetched) last_fetched, 
             comment_link 
        FROM GrabbedSites 
       WHERE published BETWEEN DATE_SUB('2010-09-03', INTERVAL 1 DAY) 
                           AND '2010-09-03' 
    ORDER BY published;
    

    解释说:使用where;使用filesort

    2 回复  |  直到 15 年前
        1
  •  1
  •   OMG Ponies    15 年前

    首先要注意的是,MySQL每个psuedo SELECT只使用一个索引(不是语句)——当您使用EXPLAIN查看SELECT的输出时,您将看到每个psuedo SELECT选择了哪个索引。EXPLAIN只能在SELECT上运行,因此我们必须假设,当您交换SELECT的语法时,DELETE/UPDATE使用相同的计划。。。

    • 选择
    • 连接(ANSI-92语法)
    • 其中(因为有两个ANSI-89 过滤(此处)
    • 订货人

    最终,它是优化器根据它的算法和现有的统计信息来选择使用什么。你可以用 ANALYZE TABLE syntax

    附录

    MySQL还限制了用于分配索引的空间量- 1,000 bytes for MyISAM tables, and 767 bytes for InnoDB tables

    1. 主键(在v5的某个地方,为pk创建索引变得自动)
    2. 外键(下一个最有可能加入候选
    3. 过滤标准(假设您有空间)
        2
  •  0
  •   Pablo Santa Cruz    15 年前