我正在开发一个带有相当大的Oracle数据库的项目(尽管我的问题同样适用于其他数据库).我们有一个Web界面,允许用户搜索几乎任何可能的字段组合.
为了使这些搜索更快,我们将索引添加到我们认为用户通常会搜索的字段和字段组合.但是,由于我们并不真正了解客户将如何使用此软件,因此很难确定要创建哪些索引.
空间不是一个问题; 我们有一个4 TB的RAID驱动器,我们只使用了一小部分.但是,我担心索引太多会导致性能损失.因为每次添加,删除或修改行时都需要更新这些索引,我想在单个表上有几十个索引是个坏主意.
那么有多少指数被认为太多了?10?25?50?或者我应该只是覆盖真正的,非常常见和明显的案例而忽略其他一切?
在低选择性色谱柱上选择记录的策略范围有哪些?
一个示例可能是订单表,多年来,您构建了大量已完成的订单,但通常需要选择活动订单.订单可能会经历生命周期,例如放置,库存分配,从仓库中挑选,发送给客户,开具发票和付款.订单可能还会被取消,保留等.大多数记录最终将处于最终状态(例如已付款),但您可能经常需要选择已分配的订单.在这种情况下,顺序读取会很慢.
索引
MySQL的类似问题:低基数/选择性列=如何索引?
索引是否在SQL中吮吸?
什么是索引以及如何使用它们来优化数据库中的查询?
定义索引:哪些列和性能影响?
和其他许多其他相关的因素.
我读过的方法(在stackoverflow和其他地方)包括
create index x on t(c2) where c1='a')active_customers(customer_id)我目前的DBMS不支持上面列出的前三个选项,其余的似乎有问题 - 还有其他常用的方法吗?
更新:我见过 - 索引低选择性列,但只选择高选择性值.
假设我有与此类似的多态
| document_id | owner_type | owner_id |
| 1 | Client | 1 |
| 1 | Client | 2 |
| 2 | User | 1 |
Run Code Online (Sandbox Code Playgroud)
我知道我会调用查询来寻找owner_type和owner_type+owner_id
SELECT * FROM document_name_ownerships WHERE owner_type = 'Client`
SELECT * FROM document_name_ownerships WHERE owner_type = 'Client` and owner_id = 1
Run Code Online (Sandbox Code Playgroud)
让我们忽略如何索引document_id 我想知道在此 SQL 场景中索引所有者列的最佳方式(性能)是什么
解决方案1:
CREATE INDEX do_type_id_ix ON document_ownerships (owner_type, owner_id)
Run Code Online (Sandbox Code Playgroud)
这样我就只有一个适用于这两种情况的索引
解决方案2:
CREATE INDEX do_id_type_ix ON document_ownerships (owner_id, owner_type)
CREATE INDEX do_type_ix …Run Code Online (Sandbox Code Playgroud) 我正在从事一项非常艰巨的项目; 我的问题是关于使用BOOLEAN值来确定是否需要进一步数据处理时获得的效率.
例如:如果我有一张列出所有生物的表格.在另一个关系性的表中列出了他们的冬眠期,以及冬眠期间每天消耗的卡路里.
在(生物)表中包含"hibernates"BOOLEAN的值是否有效.
如果为true,则转到"hibernation_creature_info_relations"表并找到具有该ID的生物并返回该信息.
这意味着对于"hibernates"= false的值的所有生物将阻止SQL必须搜索"hibernation_creature_info_relations"的大表.
或者当使用ID时,如此快速地检查"hibernation_creature_info_relations"表的过程如此快,以至于如果休眠值设置为true或false,必须处理基于hatennation的值的参数,实际上会对性能产生更大的影响. ?
我希望这是足够的信息,以帮助您了解我的要求,如果不是,请让我知道,以便我可以改写或包含更多细节.