Mark Henderson Asked: 2012-05-21 17:07:36 +0800 CST2012-05-21 17:07:36 +0800 CST 2012-05-21 17:07:36 +0800 CST 在 asc 和 desc 方向上创建索引 772 在过去的几周里,我一直在反对旧的 Firebird 数据库。由于各种原因,这个数据库很糟糕,但我注意到的一件事是每个表的每个字段都有两个索引;每个都有一个片段,一个按顺序排列,一个按顺序排列。ascdesc 除了为每个表中的每个字段都有一个索引的 wtf'ness 之外,它让我思考 - 单段索引是否有任何优势让两个索引具有相同的索引段,但一个 indesc和一个 in asc?是否有任何收获,或者现代 DBMS 是否会简单地使用asc索引并从头开始并在需要时向后工作? index firebird 3 个回答 Voted Best Answer Mark Storey-Smith 2012-05-21T22:23:48+08:002012-05-21T22:23:48+08:00 听说现代数据库不能进行逆序索引扫描,我会感到惊讶。 SQL Server 确实如此,并且在执行计划中指示了向后扫描。 Firebird(在页面文本中向后搜索)。 MySQL Mark Rotteveel 2013-09-03T23:42:02+08:002013-09-03T23:42:02+08:00 虽然 Firebird 索引理论上是双向的,但引擎实际上并没有使用双向性,因为由于页面的写入顺序,反向不可信:当索引页面被拆分时,页面之间的链接会被重写,如果这与反向读取它可能会读取仍然指向旧索引页面而不是新添加页面的链接,从而导致它跳过索引条目。Firebird for the Database Expert: Episode 3 - On Disk Consistency对此进行了解释。 因此,由于不能保证索引的双向性,Firebird 仅在其声明的方向(升序或降序)读取索引。现在关于为什么你的数据库有所有这些索引,我假设设计数据库的人不知道他在做什么,或者他认为添加这些索引会使任何列的排序更快。 Roy Damman 2013-07-11T06:33:22+08:002013-07-11T06:33:22+08:00 是的,当不使用降序索引时,大型表上会出现明显的性能损失(FB 2.5),即: select first 1 * from mytable where pk_id >= 200000 order by pk_id desc 此查询用于根据主键字段“pk_id”(整数)的值查找上一条记录。
听说现代数据库不能进行逆序索引扫描,我会感到惊讶。
虽然 Firebird 索引理论上是双向的,但引擎实际上并没有使用双向性,因为由于页面的写入顺序,反向不可信:当索引页面被拆分时,页面之间的链接会被重写,如果这与反向读取它可能会读取仍然指向旧索引页面而不是新添加页面的链接,从而导致它跳过索引条目。Firebird for the Database Expert: Episode 3 - On Disk Consistency对此进行了解释。
因此,由于不能保证索引的双向性,Firebird 仅在其声明的方向(升序或降序)读取索引。现在关于为什么你的数据库有所有这些索引,我假设设计数据库的人不知道他在做什么,或者他认为添加这些索引会使任何列的排序更快。
是的,当不使用降序索引时,大型表上会出现明显的性能损失(FB 2.5),即:
此查询用于根据主键字段“pk_id”(整数)的值查找上一条记录。