Sql 把索引放在一个有很多BOOL/TINYINT的表上?
一位老导师曾经告诉我,对于大多数使用Sql 把索引放在一个有很多BOOL/TINYINT的表上?,sql,mysql,postgresql,Sql,Mysql,Postgresql,一位老导师曾经告诉我,对于大多数使用WHERE子句的内容,都要放置索引 我应该在BOOL/TINYINT上添加索引吗?我正在处理的表中有大量的布尔值,结果通常由1-20个布尔值条件中的任意一个进行过滤。我不能谈论微小的整数(很可能是相同的),但我不会对布尔值进行索引,原因很简单,它们只能假设两个值 就我所记得的,您希望在具有高基数的列上使用索引。对于一个只能假定两个不同值的列,有一个索引有什么意义?这是浪费空间,没有真正的收获 我还建议大家进一步阅读 正如一些已经指出的,您可能需要考虑将索引放在
WHERE
子句的内容,都要放置索引
我应该在
BOOL/TINYINT
上添加索引吗?我正在处理的表中有大量的布尔值,结果通常由1-20个布尔值条件中的任意一个进行过滤。我不能谈论微小的整数(很可能是相同的),但我不会对布尔值进行索引,原因很简单,它们只能假设两个值
就我所记得的,您希望在具有高基数的列上使用索引。对于一个只能假定两个不同值的列,有一个索引有什么意义?这是浪费空间,没有真正的收获
我还建议大家进一步阅读
正如一些已经指出的,您可能需要考虑将索引放在条件集合上;哪些取决于您的查询。
有一种情况下,布尔字段(或其他低基数字段)上的索引可能很有用。如果其中一个值相对较少(例如,百万分之十的真值),并且您经常搜索这几个值,那么索引将非常有用。您可以对字段组合进行索引Bool1上的索引可能毫无意义,因为只有2个值。在Bool1、Bool2、Bool3、Bool4、Bool5上建立索引…Bool16有2^16个值。通常至少不希望在布尔值上建立索引。但是,如果布尔字段从索引中删除了大量数据,那么使用布尔检查作为谓词在其他内容上创建部分索引可能是最有效的索引选项之一。这通常比使用另一列进行组合索引要有效得多。我的想法与此类似,因为bool的条件已经尽可能原子化了。您的索引将真正取决于您的查询。如果你把它贴出来,我相信我们能帮上忙。您可能还希望在数据库引擎中运行EXPLAIN语句。在MySql中,EXPLAIN是您最好的选择,重要的是选择性,而不是可能性的数量:如果每1000行中只有1行具有
FOO=TRUE
,那么很可能值得索引+0.+1. 这里的许多答案似乎忽略了一个事实,即重要的是选择性,而不是可能值的数量。它仍然会带来相当大的开销,因为它必须存储索引中每一行的值,而不仅仅是它将匹配的值。这就是为什么部分索引通常是一个更好的选择。选择性是重要的,而不是可能性的数量:如果每1000行中只有1行具有FOO=TRUE
,那么很可能值得索引+0