我有一个MySQL表,有22个字段或属性,即Geo, Theater, Area, TotalSales
等。
我希望TotalSales
可以是Geo
或Theater
或Area
或者
对于特定theater
的特定Geo
,依此类推。
该表由几乎302245
条记录
那么,如何将其编入索引以便更快地访问?
我应该在每个字段上单独放置一个索引,即geo
,theater
,或者
我应该将所有22个字段的索引统称为,
index on (geo, theater, area, TotalSales... and so on)
答案 0 :(得分:1)
只有第一个列(在此示例中为INDEX(geo, theater, area, ...)
)包含在geo
子句中时,复合WHERE
才有用。所以这不是一个好的候选人。
每列上22个单独的索引是一个丑陋的可能性,但可能接近“最佳”。
索引“标志”列(是/否,M / F,ON / OFF等)几乎总是无用的。通常,如果索引不会将结果集限制为小于表的约20%,则优化程序将确定表扫描比在索引和数据之间来回反弹更快。因此,这可以通过消除任何低基数列来减少22。
另一方面,'复合'索引通常很好,即使它们包含一个标志。您提到INDEX(geo, theater)
- 如果指定了两者,这将非常好,如果geo
中仅指定了WHERE
,那么也会很好。 (如果只指定了theater
则没用。)因此,考虑22个双列索引而不是22个单列索引,其中22列中的每一列都作为第一列出现一次索引中的列。
但是......好吧,我不想在这里复制我的整个博客,所以让我发送给你my index cookbook来发现如何制作'好'的索引。
但是......这就引出了制造多少的问题。 22是“太多”。在某些时候,更多索引的开销将超过收益。我建议你看看人们通常询问的是什么。然后为十几个最受欢迎的查询制作最佳索引。