在MySQL中,如果foo被索引,那么将SELECT foo的性能提高吗?

时间:2010-09-04 02:51:48

标签: sql mysql indexing

在MySQL中,如果将foo编入索引,是否会使SELECT foo的性能提高?

RedditMirror.cc,我在GrabbedSites表中有一个包含120万条记录的数据库,这个数字每天增加约500-2000。

在我的职业生涯早期,我被指导应该编入索引的唯一列是您

的列。
  1. 将来会做WHERE或JOIN SELECT / UPDATE,
  2. 需要它们是独一无二的数据。
  3. 因此,GrabbedSites只有一个键索引(除了主键):categoryID,但查询了8列。

    该网站获得了大量的闪存流量,有时每天超过100,000个独立访问者,并且数据库变得“征税”,使用率约为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;
    

    只有索引“已发布”。

    解释说:用在哪里;使用filesort

2 个答案:

答案 0 :(得分:1)

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

据我所知,大多数数据库(嵌入式数据库可能很奇怪)支持在以下子句中使用索引:

  • 选择
  • JOIN(ANSI-92语法)
  • WHERE(因为这里有ANSI-89 过滤)
  • HAVING(等同于,但与WHERE不同 - 允许聚合使用而不需要子查询)
  • ORDER BY

我不是100%在GROUP BY,所以我暂时忽略它。

最终,基于它的算法和它所掌握的统计数据,它是优化器选择使用什么。您可以使用ANALYZE TABLE syntax刷新统计信息(定期,而不是经常请)。

附录

MySQL还限制了分配索引的空间量 - 1,000 bytes for MyISAM tables, and 767 bytes for InnoDB tables。因为MySQL每个psuedo-SELECT只使用一个索引,所以覆盖索引(包含多个列的索引)是一个好主意,但它确实是测试最常见的查询和尽可能优化它。索引优先级应为:

  1. 主键(在v5中的某处,为pk创建的索引变为自动)
  2. 外键(下一个最有可能是JOIN候选人
  3. 过滤标准(假设您有空间)

答案 1 :(得分:0)

如果您要对要计划索引的列进行过滤,则可能会提高性能。由于您的数据库主要是只读的(您每天只能获得500-2000个新行,而且可能没有那么多更新),您可以给它一个机会。如果你添加这些索引,你绝对不会伤害你的数据库。