在Oracle中使用表时,您如何知道何时设置好索引而不是坏索引?
这取决于你的"好"和"坏"的含义.基本上你需要意识到你添加的每个索引都会提高该列搜索的性能(因此在person表的'lastname'列中添加索引会提高在其中包含"where lastname ="的查询的性能)但是降低整个表的写入性能.
原因是当您添加或更新行时,它必须添加或更新表本身以及该行所属的每个索引.因此,如果表上有五个索引,则每个添加必须写入六个位置 - 五个索引和表 - 并且在最坏的情况下更新可能会触及六个位置.
索引创建是一种平衡行为,然后在查询速度和写入速度之间.在某些情况下,例如一个数据集市只能在一夜之间在一夜间工作中加载数据但每天查询数千次,因此使用索引重载并尽可能加快查询速度非常有意义.但是,对于在线交易处理系统,您希望尝试在它们之间找到平衡点.
因此,简而言之,将索引添加到在select查询中经常使用的列,但尝试避免添加太多,因此首先添加最常用的列.
在那之后进行负载测试,看看性能如何在生产条件下做出反应,并进行大量调整以找到可保证的平衡.
多样化,高度特异性或独特的字段构成良好的索引.例如日期和时间戳,唯一递增数字(通常用作主键),人名,车牌号等......
反例就是性别 - 只有两个共同的值,因此索引实际上并没有帮助减少必须扫描的行数.
全长描述性自由格式字符串会生成较差的索引,因为执行查询的人很少知道字符串的确切值.
线性排序的数据(例如时间戳或日期)通常用作聚簇索引,它强制按行索引顺序存储行,并允许按顺序访问,大大加快了范围查询(例如'给我所有的销售订单十月到十二月之间').在这种情况下,DB引擎可以简单地寻找由该范围指定的第一个记录并开始顺序读取,直到它到达最后一个.