有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java当使用BinaryObject时,我是否需要为每个字段创建索引?

我一直在用ApacheIgnite做一些实验。我正在基于以下代码开发一个灵活的对象

public static void main(String[] args) throws IgniteException {
Ignite start = Ignition.start("examples/config/example-ignite.xml");
CacheConfiguration<Integer, BinaryObject> cfg = new CacheConfiguration<>();
cfg.setQueryEntities(new ArrayList<QueryEntity>() {{
    QueryEntity e = new QueryEntity();
    e.setKeyType("java.lang.Integer");
    e.setValueType("BinaryTest");
    e.setFields(new LinkedHashMap<String, String>(){{
        put("name", "java.lang.String");
    }});
    add(e);
}});
IgniteCache<Integer, BinaryObject> cache = start.getOrCreateCache(cfg).withKeepBinary();
BinaryObjectBuilder builder = start.binary().builder("BinaryTest");
builder.setField("name", "Test");
cache.put(1, builder.build());

QueryCursor<List<?>> query = cache.query(new SqlFieldsQuery("select name from BinaryTest"));
System.out.println(query.getAll());

但是,我不想在每个字段上都有索引(我怀疑这很昂贵)。我意识到,如果没有索引,这可能会导致查询速度变慢——我对此没有意见

使用上面的示例代码,如果不先为该字段创建索引,我就无法形成SQL查询

可以在没有索引的二进制对象上使用SQL查询吗?(注意:我将只在每个缓存中存储一个“类型”的二进制对象)


共 (1) 个答案

  1. # 1 楼答案

    只有当你明确要求索引时,才会创建索引。有关如何配置它们的详细信息,请参见[1]

    请注意,SQL模式当前是静态的。因此,如果向缓存数据类型动态添加一个字段(二进制格式[2]支持该字段),则该字段不能参与SQL查询。要实现这一点,需要使用不同的配置重新创建缓存并重新加载数据。然而,有一张票[3]可以摆脱这种限制

    [1]https://apacheignite.readme.io/docs/sql-queries

    [2]https://apacheignite.readme.io/docs/binary-marshaller

    [3]https://issues.apache.org/jira/browse/IGNITE-735