我在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 :(得分:1)
在这种情况下,我通常会记录搜索条件,返回的结果数以及执行搜索所需的时间。仅仅因为您在任何领域创建搜索的灵活性并不意味着您的用户可以利用这种灵活性。我通常会在合理的组合上创建索引,然后在确定使用模式后,删除使用不当的索引或创建新的未预料到的索引。
我不确定MySQL是否支持偏斜数据的统计数据或直方图,但性别指数可能有效,也可能无效。如果MySQL支持统计信息,那么这将指示索引的选择性。在一般人群中,具有50/50分割的字段的索引将无济于事。如果您的样本数据是计算机程序员,而且数据是95%的男性,则搜索女性将使用该索引。
答案 1 :(得分:0)
使用EXPLAIN。
(我会说,也可以使用Postgres,哈哈)。
似乎MySQL的最新版本可以在同一个查询中使用多个索引,他们称之为索引合并。在这种情况下,每列1个索引就足够了。
性别是一种特殊情况,因为选择性是50%,你不需要索引,这会适得其反。
答案 2 :(得分:0)
在单个字段上创建索引很有用,但如果您的数据是varchar类型并且每个记录具有不同的值,那么它将非常有用,因为birthyear和postcode是已经被很好索引的数字。
你可以对birthyear进行索引,因为它对于许多记录应该是不同的(但是我猜最多可以达到120个出生年份。)
我认为性别不需要索引。
您可以找出哪些字段组合最有可能提供不同的结果并对其进行索引,例如:birthyear - postcode,id - birthyear,id - postcode。