我应该在mysql表中的tinyint字段类型上创建索引吗?

时间:2009-12-22 12:01:18

标签: mysql indexing

我刚刚开发一个Web应用程序,发现大多数mysql表都有字段,比如is_live, can_do, required, published(以及更多)字段类型为TINYINT,并且仅使用0 or 1。我只是想知道是否需要在这些列上创建索引,因为脚本也使用包含这些列的连接。所以问题是:

我是否应该为这些列添加索引?

我应该将类型改为其他吗?

请注意这个问题更多的是理解概念而不是解决问题。

感谢。

5 个答案:

答案 0 :(得分:18)

一般建议是布尔字段的索引很少有用。

B树索引对于高基数数据(即具有许多可能值的列,其中列中的数据是唯一的或几乎唯一的)最有效。

某些数据库引擎(如Oracle和Postgres)支持Bitmap Indexes。传统上,位图索引被认为适用于性别(男性或女性)等数据,这些数据具有少量不同的值,但很多都出现这些值。

MySQL当前不支持位图索引,但可以使用其“index_merge”功能实现类似的功能。应使用Falcon引擎(Source)引入位图索引。

答案 1 :(得分:6)

我的数据库大师说,“如果你不知道查询,就不要添加任何索引”。在您的情况下,看起来您知道查询。所以是的,我们可以考虑索引。 如果您有数据仓库类型的系统,请创建位图索引。否则不要创建任何索引。在如此小的基数列上,B树索引是不好的。

答案 2 :(得分:0)

我怀疑这些字段是在连接中使用的,因为它们将0或1作为输入。

在这种情况下,索引的主要用途是能够直接从索引中检索数据,但由于索引非常大,开销很可能会使这种方法变得无效。

然而,这里唯一有效的方法是尝试使用您的数据集,因为您使用的数据会对结果产生重大影响。

答案 3 :(得分:0)

我认为你不应该为这些字段添加索引,因为它们不包含不同的数据。但是对于字段类型,您可以考虑枚举类型。

答案 4 :(得分:-1)

决定是否索引不应该依赖于数据类型,而是依赖于

  • 您搜索字段的频率
  • 表格将有多少记录(数量级)
  • 是否可以为用户
  • 等待非索引查询(全表扫描)