在MySQL中,如果将foo编入索引,是否会使SELECT foo的性能提高?
在RedditMirror.cc,我在GrabbedSites表中有一个包含120万条记录的数据库,这个数字每天增加约500-2000。
在我的职业生涯早期,我被指导应该编入索引的唯一列是您
的列。因此,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
答案 0 :(得分:1)
首先要注意的是MySQL每个psuedo-SELECT(非语句)只使用一个索引 - 当您使用EXPLAIN查看SELECT的输出时,您将看到每个选择的索引。 EXPLAIN只能在SELECTS上运行,因此我们必须假设在替换SELECT语法时DELETE / UPDATE使用相同的计划...
据我所知,大多数数据库(嵌入式数据库可能很奇怪)支持在以下子句中使用索引:
我不是100%在GROUP BY,所以我暂时忽略它。
最终,基于它的算法和它所掌握的统计数据,它是优化器选择使用什么。您可以使用ANALYZE TABLE syntax刷新统计信息(定期,而不是经常请)。
MySQL还限制了分配索引的空间量 - 1,000 bytes for MyISAM tables, and 767 bytes for InnoDB tables。因为MySQL每个psuedo-SELECT只使用一个索引,所以覆盖索引(包含多个列的索引)是一个好主意,但它确实是测试最常见的查询和尽可能优化它。索引优先级应为:
答案 1 :(得分:0)
如果您要对要计划索引的列进行过滤,则可能会提高性能。由于您的数据库主要是只读的(您每天只能获得500-2000个新行,而且可能没有那么多更新),您可以给它一个机会。如果你添加这些索引,你绝对不会伤害你的数据库。