2012-07-10 99 views
2

如果我试图增加使用特定表中4个不同列的查询的性能,我应该创建4个不同的索引(每个索引单独一个),还是应该创建1个索引以及所有列包括在内呢?MySql二级索引

+2

你应该尝试每个想法,你能拿出和前后比较性能,然后使用一个,让所有使用情况最好的整体表现上升。 – mellamokb 2012-07-10 19:22:44

+0

我不介意尝试每一个......主要的问题是创建这些索引可能需要每个8-10小时,这个问题可以解决得越快越好。如果没有人有任何具体的理由去做这一个或另一个,这将是我的方法 – Miles 2012-07-10 19:23:35

+1

把你的数据的一个子集,转储到sqlfiddle,至少你可以看看执行计划,而不需要8-10小时。 – 2012-07-10 19:24:50

回答

2

具有所有4个值的一个索引是我的经验最快的。如果您使用某个地方,请尝试将这些列放置在一个顺序中,以使其对该地点有用。

0

具有所有四列的索引;在WHERE中使用的列应该首先出现,而那些为你做==比较的列应该首先出现。

有时,优先考虑整数列可以获得更好的结果;因人而异。

因此,例如,

SELECT title, count(*) FROM table WHERE class = 'post' AND topic_id = 17 
    AND date > @@BeginDate and date < @@EndDate; 

会对指数:topic_id,张贴,日期和标题,在这个秩序。

仅使用索引中的“标题”,以便DB可以为匹配查询的记录找到“标题”的值,而不额外访问数据表。

第一个字段的记录分布越平衡,你会得到最好的结果(在这个例子中,假设10%的行有topic_id = 17,那么你将丢弃其他90%,而不需要用'post'运行字符串比较 - 不是字符串比较特别昂贵。根据数据的不同,您可能会发现最好先指定日期并稍后发布,或者甚至先使用日期作为MySQL PARTITION。

+0

然后再次,有多少个查询?您应计算查询成本乘以该查询的访问次数;请记住,索引维护会增加总体成本(例如INSERT和UPDATE会运行得慢一点)。 – LSerni 2012-07-10 19:34:53