sqlite中的复合指数

时间:2018-06-22 07:06:05

标签: java android android-sqlite

我的表由104856行组成,具有13列。 该表的架构如下:

public static final class Vehicle4Wheel implements BaseColumns{
    public static final String TABLE_NAME="Vehicle4Wheel";
    public static final String VEH_ID = "VEH_ID";
    public static final String VEH_REG_NUM = "VEH_REG_NUM";
    public static final String VEH_ENGINE_NO = "VEH_ENGINE_NO";
    public static final String VEH_CHASIS_NO= "VEH_CHASIS_NO";
    public static final String VEH_MAKE= "VEH_MAKE";
    public static final String VEH_MAKE_MODEL= "VEH_MAKE_MODEL";
    public static final String VEH_COLOR = "VEH_COLOR";
    public static final String VEH_MODEL = "VEH_MODEL";
    public static final String VEH_CC = "VEH_CC";
    public static final String OWN_NAME = "OWN_NAME";
    public static final String OWN_FNAME = "OWN_FNAME";
    public static final String CNIC = "OWN_CNIC";
    public static final String OWN_ADDRESS = "OWN_ADDRESS";
} 

我想使用VEH_REG_NUM,VEH_ENGINE_NO,VEH_CHASIS_NO搜索数据。 为了在表中更快地进行搜索,我创建了一个复合索引。索引查询如下:

String indexVeh4Wheel = "CREATE INDEX veh4wheel_search ON Vehicle4Wheel(VEH_REG_NUM, VEH_ENGINE_NO, VEH_CHASIS_NO)";

当我使用VEH_REG_NUM搜索数据时,搜索速度很快。
当我使用VEH_ENGINE_NO和VEH_CHASIS_NO搜索数据时,搜索速度很慢。

是否需要为每列创建一个单独的索引以获得更快的结果?
喜欢,

String indexVeh4reg = "CREATE INDEX veh4wheel_reg ON 
                       Vehicle4Wheel(VEH_REG_NUM)";
String indexVeh4eng = "CREATE INDEX veh4wheel_eng ON 
                       Vehicle4Wheel(VEH_ENGINE_NO)";
String indexVeh4chass = "CREATE INDEX veh4wheel_chass ON 
                         Vehicle4Wheel(VEH_CHASIS_NO)";

1 个答案:

答案 0 :(得分:1)

简而言之:是的。

DB索引是对行的引用的列表*,按创建索引时提供的任何列进行排序。排序的工作方式与“排序依据”相同-仅当所有前者不是决定性的条件时,才考虑后者的条件。对于您而言,除非您有多辆具有相同注册号的车辆,否则将永远不会使用其他两列。

即使是这样,也不会加快搜索速度:想象一个按姓氏,然后按名字排序的人员列表。这对于两种类型的搜索将非常有用:

  • 查找姓氏相同的人
  • 查找具有特定名字和姓氏的人

但是,对于搜索具有特定名字的人没有太大帮助。无论如何,您都需要浏览所有列表,因为名字与名字不同,永远不会聚集在一起。