我刚刚开发一个Web应用程序,发现大多数mysql表都有字段,比如is_live, can_do, required, published
(以及更多)字段类型为TINYINT,并且仅使用0 or 1
。我只是想知道是否需要在这些列上创建索引,因为脚本也使用包含这些列的连接。所以问题是:
我是否应该为这些列添加索引?
我应该将类型改为其他吗?
请注意这个问题更多的是理解概念而不是解决问题。
感谢。
答案 0 :(得分:18)
一般建议是布尔字段的索引很少有用。
B树索引对于高基数数据(即具有许多可能值的列,其中列中的数据是唯一的或几乎唯一的)最有效。
某些数据库引擎(如Oracle和Postgres)支持Bitmap Indexes。传统上,位图索引被认为适用于性别(男性或女性)等数据,这些数据具有少量不同的值,但很多都出现这些值。
MySQL当前不支持位图索引,但可以使用其“index_merge”功能实现类似的功能。应使用Falcon引擎(Source)引入位图索引。
答案 1 :(得分:6)
我的数据库大师说,“如果你不知道查询,就不要添加任何索引”。在您的情况下,看起来您知道查询。所以是的,我们可以考虑索引。 如果您有数据仓库类型的系统,请创建位图索引。否则不要创建任何索引。在如此小的基数列上,B树索引是不好的。
答案 2 :(得分:0)
我怀疑这些字段是在连接中使用的,因为它们将0或1作为输入。
在这种情况下,索引的主要用途是能够直接从索引中检索数据,但由于索引非常大,开销很可能会使这种方法变得无效。
然而,这里唯一有效的方法是尝试使用您的数据集,因为您使用的数据会对结果产生重大影响。
答案 3 :(得分:0)
我认为你不应该为这些字段添加索引,因为它们不包含不同的数据。但是对于字段类型,您可以考虑枚举类型。
答案 4 :(得分:-1)
决定是否索引不应该依赖于数据类型,而是依赖于