2009-10-22 60 views
2

我有一个表具有以下字段的MySQL数据库:应该索引多少个字段,我应该如何创建它们?

ID | GENDER | BIRTHYEAR | POSTCODE 

用户可以搜索使用的任何字段的表中的任意组合(即SELECT * FROM table WHERE GENDER = 'M' AND POSTCODE IN (1000, 2000);SELECT * FROM table WHERE BIRTHYEAR = 1973;

从MySQL文档,它使用左侧索引。因此,如果我在所有4列上创建索引,则不使用ID字段的索引。我是否需要为字段(ID; ID/GENDER; ID/BIRTHYEAR等)的每种可能组合创建一个索引,或者为所有字段创建一个索引就足够了?

如果它有什么区别,这个表里有300万条记录。

+0

你没有提到ORDER BY:如果使用ORDER BY ... LIMIT,使用索引来执行顺序,同时可以获得巨大的胜利。你最常见的是什么? – peufeu 2009-10-22 09:37:45

回答

0

使用说明。

(我会说,使用Postgres也是,大声笑)。

看来最近的MySQL版本可以在同一个查询中使用多个索引,他们称之为Index Merge。在这种情况下,每列1个索引就足够了。

性别是一种特殊情况,因为选择性为50%,您不需要索引就可以适得其反。

+0

其实,我们的用户不需要给他们的性别,所以有3个选项:M,F和O. :) 既然只有3个选项,那么索引是否仍然没有必要? – cabuki 2009-10-22 09:11:24

+1

当您选择多于约5-15%的行时,索引不起作用。阈值取决于许多因素,但您会明白:索引查找有成本。 – peufeu 2009-10-22 09:36:20

0

在单个字段上创建索引很有用,但如果您的数据是varchar类型并且每个记录具有不同的值,那么它会非常有用,因为birthyear和postcode是已编好索引​​的数字。

你可以对生日年份进行索引,因为它对许多记录应该是不同的(但是最多可达120个新生儿,我猜最大)。

性别在我看来并不需要索引。

你可以找出哪些字段组合最有可能给不同的结果和索引,如:birthyear - postcode,id - birthyear,id - postcode。

1

在这种情况下,我通常会记录搜索条件,返回的结果数量以及执行搜索所花费的时间。仅仅因为您在任何领域创建灵活的搜索方式并不意味着您的用户可以充分利用这种灵活性。我通常会在合理的组合上创建索引,然后一旦我确定使用模式就会放弃使用率低的索引或创建新的未知索引。

我不确定MySQL是否支持歪斜数据的统计量或直方图,但性别上的索引是否可能工作。如果MySQL支持统计数据,那么这将指示索引的选择性。在一般人群中,50/50分位的场地指数无济于事。如果你的样本数据是计算机程序员,并且数据是95%的男性,那么搜索女性会使用该索引。

相关问题