mysql - 应该索引多少个字段以及我应该如何创建它们?

标签 mysql indexing

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

ID | GENDER | BIRTHYEAR | POSTCODE

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

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

如果有什么不同的话,这个表中有超过 300 万条记录。

最佳答案

在这种情况下,我通常会记录搜索条件、返回的结果数量和执行搜索所花费的时间。仅仅因为您创造了通过任何字段进行搜索的灵 active ,并不意味着您的用户会利用这种灵 active 。我通常会根据合理的组合创建索引,然后在确定使用模式后删除使用率低的索引或创建新的未被怀疑的索引。

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

关于mysql - 应该索引多少个字段以及我应该如何创建它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1605905/

相关文章:

JavaScript + PHP 和 SSE - 服务器发送的事件和 MySQL

mysql - 如何为 2 个 SQL 查询创建一个 MySQL 索引?

mysql - Django 模型 ID 被 GenericForeignKey 的 ID 覆盖

php - 我可以在 PHP 中混合使用 MySQL API 吗?

python - 读取CSV文件时出现 "IndexError: list index out of range"错误如何解决

python - 使用 NumPy 在索引处设置值的更简洁方法

c++ - 指向一个索引的pointed

mongodb - 在 mongodb 中,为什么查询索引子文档数组比索引一级文档更快?

mysql - 如何根据日期时间字段和间隔字段使用 Laravel 和 MySQL 选择行

php - mySQl,查询 : How to customize selection from database?