Mysql 应该为多少字段编制索引,我应该如何创建它们?

Mysql 应该为多少字段编制索引,我应该如何创建它们?,mysql,indexing,Mysql,Indexing,我在MySQL数据库中有一个表,其中包含以下字段: ID | GENDER | BIRTHYEAR | POSTCODE 用户可以使用任意组合中的任何字段搜索表格(即,SELECT*FROM table WHERE GENDER='M'和POSTCODE in(10002000);或SELECT*FROM table WHERE BIRTHYEAR=1973;) 从MySQL文档中,它使用左索引。因此,如果我在所有4列上创建索引,如果不使用ID字段,它将不会使用索引。我是否需要为每个可能的字段

我在MySQL数据库中有一个表,其中包含以下字段:

ID | GENDER | BIRTHYEAR | POSTCODE
用户可以使用任意组合中的任何字段搜索表格(即,
SELECT*FROM table WHERE GENDER='M'和POSTCODE in(10002000);
SELECT*FROM table WHERE BIRTHYEAR=1973;

从MySQL文档中,它使用左索引。因此,如果我在所有4列上创建索引,如果不使用ID字段,它将不会使用索引。我是否需要为每个可能的字段组合(ID;ID/性别;ID/出生年份等)创建索引,或者为所有字段创建一个索引就足够了

如果有任何不同,则此表中有300多万条记录。

请使用解释

(我会说,也使用Postgres,哈哈)

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


性别是一个特例,因为选择性是50%,所以你不需要索引,这会适得其反。

在单个字段上创建索引是有用的,但是如果你的数据是varchar类型,并且每个记录都有不同的值,那么这将非常有用,因为出生年份和邮政编码都是数字,它们已经被很好地索引了

您可以索引生日,因为它应该是不同的许多记录(但多达120年的总和在最大我猜)

在我看来,性别不需要索引


您可以找出哪些字段组合最有可能给出不同的结果,并对这些字段进行索引,例如:生日-邮政编码、id-生日、id-邮政编码。

在这种情况下,我通常会记录搜索条件、返回的结果数和执行搜索所用的时间。仅仅因为你创造了按任何字段搜索的灵活性,并不意味着你的用户利用了这种灵活性。我通常会在合理的组合上创建索引,一旦确定了使用模式,就会删除使用率较低的索引或创建新的意外索引


我不确定MySQL是否支持歪斜数据的统计或直方图,但关于性别的索引可能有效,也可能无效。如果MySQL支持统计,那么这将指示索引的选择性。在一般人群中,50/50分割的字段上的索引没有帮助。如果你的样本数据是计算机程序员,数据是95%的男性,那么搜索女性就会使用该索引。

实际上,我们的用户不需要给出他们的性别,所以有3个选项:M、F和O.:)因为只有3个选项,是否仍然不需要索引?当您选择的行数超过约5-15%时,索引没有帮助。阈值取决于许多因素,但您知道:索引查找是有成本的。您没有提到排序依据:如果您使用排序依据。。。限制,使用索引同时按和按何处进行排序可能是一个巨大的胜利。你最常用的订货方式是什么?