【发布时间】:2011-08-30 17:02:57
【问题描述】:
我正在尝试确定为下面的查询编制索引的最佳方式。
到目前为止,我已经在连接中使用的字段上创建了复合/分组索引,然后是我使用 where 子句过滤器的顺序。
或者,我应该在连接中使用的字段上创建单独的索引,并在 where/group by/order by 子句中使用的字段上创建单独的分组索引
SELECT [fields..]
FROM articles
INNER JOIN articles_to_geo
ON articles_to_geo.article_id = articles.article_id
INNER JOIN cities_whitelist
ON cities_whitelist.city_id = articles_to_geo.whitelist_city_id
INNER JOIN cities
ON cities.city_id = cities_whitelist.city_id
INNER JOIN articles_to_badges
ON articles_to_badges.article_id = articles.article_id
INNER JOIN badges
ON badges.id = articles_to_badges.badge_id
INNER JOIN sites
ON sites.id = articles.site_id
WHERE articles.expirydate > '2010-07-12'
AND articles.dateadded > '2010-08-11'
AND articles.status >= 6
AND cities.city_id = 5794
AND cities.timezone = -7
AND cities_whitelist.published = 1
AND articles_to_badges.badge_id IN (1,3,8,7)
ORDER BY sites.sort_order";
例如,我的文章表有一个分组索引:
索引 1
article_id
site_id
expirydate
status
dateadded
或者我应该有 2 个索引吗?
index 1 //用于连接子句
article_id
index 2 //用于where/order by /group by子句
site_id
expirydate
status
dateadded
注意:我的其他表也有索引。
任何帮助将不胜感激
【问题讨论】:
-
取决于您使用的 RDBMS,因为它们管理索引的方式略有不同。
-
我认为需要了解 RDBMS。此外,为您已经设置的任何一个(或多个)提供解释计划(或任何您的 rdbms 所称的)可能会有所帮助。