数据库表中的索引能够加快查询的速度。索引是数据库表字段的有序副本。附加的字段包含指向真实数据库表行的指针。排序可使访问表行的速度变快,例如,可使用二分搜索。数据库表至少有一个主索引,由它的key字段定义。它也能够有一到多个二级索引。html
本文连接:http://www.javashuo.com/article/p-rimcalnr-dz.html sql
英文原文:https://help.sap.com/doc/abapdocu_753_index_htm/7.53/en-US/abenddic_database_tables_index.htm数据库
主索引是由主键的key字段构造的惟一索引,AS ABAP总会自动建立它。对于每一个索引字段的组合,表中最多只能有一条记录。 若是没法使用主索引识别记录集,好比说,没有使用主索引查询字段,就会发生全表扫描,可能致使查询性能不佳,或者数据库系统会尝试使用合适的二级索引(若是有的话)。缓存
除了由主键定义的主索引,也能够为数据库表定义惟一或不惟一的二级索引。建立二级索引一般会提升数据库的读性能,前提是读取的时候使用到了二级索引。nosql
二级索引包含一系列数据库表字段,有一个最大3位长度的文本数字组成的ID。0是一个保留ID,用来表示主索引。string和rawstring类型的字段没法成为索引字段(全文索引除外)。也不建议使用数据类型FLTP的字段做为索引字段。ide
数据库表在数据库中被建立的时候,二级索引也会被定义。此外,能够晚些在相同的系统中建立新的二级索引。若是若是在其余系统增长新的二级索引而不做修改的话,它们会被建立为扩展索引。如下是建议的索引的命名空间:性能
数据库中的索引名字一般是DBTAB~ID,DBTAB是数据库表的名字,ID是3位字符的ID。也可能有其它名字,好比空格或下划线。优化
二级索引能够是惟一的,可是(不像主索引)不必。对惟一索引而言,数据库表不能含有一样索引值的多行数据。试图插入重复的行,会取消数据库操做,并在ABAP中触发相应的异常。在指定了client的表中,惟一索引必须包含client字段。ui
访问数据库时,数据库系统的优化器会检查是否有合适的索引,并使用它。索引的选择取决于平台,意味着能够在ABAP字典中定义非惟一索引在不一样的数据库系统中是否可用。有几种选项,spa
这些选项对表缓存的二级索引无效。若是表缓存有相关设置,那么系统就会根据表缓存的设置决定是否使用二级索引。
惟一二级索引老是会被建立,并且没法从数据库删除。可使用事务代码ST05中的SQL跟踪功能来判断访问数据时系统使用的索引。
索引对于查询数据的提高效果取决于索引表明结果数据集的能力。只有索引中能够对结果集进行有效约束的字段才是有用的。这种状况下,索引中的字段顺序是一个对于数据的访问速度十分重要的因素。第一个字段必须是那些有着大量不一样可选值的字段。在查询中,要在查询条件中指定索引的第一个字段,这样索引才有用。另外,只有一个索引字段前面的所有索引字段都在查询条件内时,这个索引字段才生效。字段的访问速度和索引是否为惟一索引无关。
对于如下状况,建立二级索引能够带来好处:
注:选择性(Selectivity),是指不重复的索引值(也叫基数,Cardinality)与表记录数(#T)的比值, Index Selectivity = Cardinality / #T
二级索引也会增长系统负载,由于每次表内容被修改时,二级索引都要作相应调整。表的每一个额外的索引都会下降插入行的性能。若是须要频繁在表中插入数据,那么应该只创建不多的索引。太多索引也会致使数据库的优化器找不到正确的索引。为了不这点,表中的索引最好不相交(没有相同的字段)。
索引应该只包含几个字段,好比,原则上不超过4个。这是由于索引字段在被更新的时候,索引也要被更新。适合做为索引的字段是:
不该该为一个表建立超过5个索引,由于,
索引只支持明确的条件值,好比=或者LIKE。若是条件中包含某些不肯定因素,好比<>,那么索引将没法改善性能。条件中包含OR时,优化器一般中止工做。换句话说,使用索引时,OR条件的字段是不生效的。一个例外是OR关系互相独立。所以,对于包含OR和索引字段结合的条件,有时须要修改条件的形式。(能够看下面的例子)
下面这个句子会致使优化器没法使用索引,由于遇到了OR:
SELECT * FROM spfli WHERE carrid = 'LH' AND ( CITYFROM = 'FRANKFURT' OR cityfrom = 'NEW YORK' ).
替换成下面这样的一个相等的句子,能够根据现有索引对整个条件进行优化(缘由见前文):
SELECT * FROM spfli WHERE ( carrid = 'LH' AND cityfrom = 'FRANKFURT' ) OR ( carrid = 'LH' AND cityfrom = 'NEW YORK' ).
SAP HANA数据库支持全文索引,全文索引能够做为二级索引。全文索引会在数据库中被建立为一个额外的可见的列。全文索引的列的内容会被保存在这个额外的列中,以某种格式存储,在相关数据被访问的时候会发挥做用。
如下是全文索引的使用条件:
全文索引老是非惟一索引。使用全文索引的访问基于数据库中的WHERE CONTAINS元素。目前这个元素在ABAP SQL中还不可用,须要使用Native SQL或者AMDP。
更多有关全文索引的信息,参看:SAP HANA Developer Guide.
参考阅读:MySQL索引入门简述