假设您有一个表,其中特定的行子集对于读取来说更热。就像is_alive
表中有一个名为people
的标志一样。或者,如果您实施软/逻辑删除,则搜索条件始终包含is_deleted = 0
。
这些字段是否应包含在这些表的索引中?如果是这样,他们应该更左或更多吗?
假设你有像......这样的索引。
people [ last_name ]
people [ zip_code ]
people [ gender ]
widgets [ category_id ]
widgets [ seller_id ]
你让他们看起来像
people [ last_name, is_alive ]
widgets [ category_id, is_valid ]
或者
people [ is_alive, last_name ]
widgets [ is_valid, category_id ]
除非与其他搜索标准配对,否则布隆本身的基数/重要性较低。
虽然几乎每次都使用这个字段,但只是觉得可疑。也许这本身就是一个“问题”?行应该穿梭到具有相同模式的不同表吗?基本上在旗帜上划分。
供应商不可知。
答案 0 :(得分:0)
某些RBDMS甚至不允许您在位字段上放置索引,例如SQL Server 2000 ......
应该与供应商无关的东西......通常是索引的选择性决定了它的用途。
如果你有一个is_alive
的索引,并且拆分为50%活着/ 50%死亡,那么该索引的选择性不足以使其有用。
然而,如果分裂更像99%活着,1%死...那么索引可以在搜索死人时使用,但在寻找活着的人时会被忽略。
因此,如果有一小部分行具有该字段的特定值,那么索引可能非常有用,和您经常搜索具有该特定值的行证明索引维护的开销是合理的。
但请记住,这完全取决于您使用的任何RDBMS,您应该针对该特定RDBMS测试任何与性能相关的设计注意事项。
答案 1 :(得分:0)
索引帮助查询的关键方法之一是减少全表扫描需要读取的页数。请记住,数据库引擎正在管理页面,而页面又存储记录。想象一下,我们有一个客户表,它有一个状态索引。过滤到单个状态的查询只需要读取一小部分数据。当然,这个比例可能是10%(对于加利福尼亚州)而不是1%对于一个小州。问题是:读取这些数据需要多少页面。
要回答这个问题,我们需要信息:(1)查询的选择性如何? (2)页面上有多少条记录?因此,如果100个记录适合页面,那么选择2%行的查询几乎总是必须读取所有页面。在这种情况下,索引无法帮助进行全表扫描。该索引反过来会产生开销,因此可能不应该使用它。
另一方面,如果只有1条记录适合页面,那么选择2%行的查询只需读取2%的页面 - 节省50倍。几乎所有索引产生的开销都是值得的。
因为索引被用于多种目的,并且因为不同的数据库引擎以不同的方式实现它们,并且因为页面表的实现方式不同,等等,所以没有硬性规定。但是,我通常可以说低基数标志可能不适合索引。
在我考虑它时,我可以想到一个索引可能证明有效的案例。那将是宽行和可以由索引专门处理的查询(选择标志,从表组按标志计数(*))。
另一方面,如果你有几个这样的标志,复合索引可能有助于查询性能。