Ignite實戰( 六 )

在上面的示例中 , @QuerySqlField(index = true)在類的所有字段以及Address類中的Address對象上都指定了注解Person 。
這使得執行如下 SQL 查詢成為可能:
QueryCursor<List<?>> cursor = personCache.query(new SqlFieldsQuery( "select * from Person where street = 'street1'"));請注意,您不需要address.street在 SQL 查詢的 WHERE 子句中指定 。這是因為Address類的字段在表中被展平,Person這僅允許我們直接訪問Address查詢中的字段 。
3.注冊索引類型定義索引和可查詢字段后,必須在 SQL 引擎中注冊它們以及它們所屬的對象類型 。
要指定應該索引哪些類型,請在方法中傳遞相應的鍵值對,CacheConfiguration.setIndexedTypes()如下例所示 。
// Preparing configuration.CacheConfiguration<Long, Person> ccfg = new CacheConfiguration<>();// Registering indexed type.ccfg.setIndexedTypes(Long.class, Person.class);此方法只接受成對的類型:一個用于鍵類,另一個用于值類 ?;鳛楹醒b類型傳遞 。
4.組索引要設置可以加速復雜條件查詢的多字段索引 , 可以使用@QuerySqlField.Group注解 。如果您希望一個字段成為多個組的一部分 , 您可以添加多個@QuerySqlField.Group注釋 。orderedGroups
例如,在Person下面的類中,我們有一個age屬于索引組的字段,該age_salary_idx組以“0”的組順序和降序排序 。此外 , 在同一個組中,我們有salary一個組順序為“3”和升序排序的字段 。此外,該字段salary本身是一個單列索引(index = true除了orderedGroups聲明之外還指定了參數) 。組order不必是特定的數字 。只需要對特定組內的字段進行排序 。
public class Person implements Serializable {/** Indexed in a group index with "salary". */@QuerySqlField(orderedGroups = { @QuerySqlField.Group(name = "age_salary_idx", order = 0, descending = true) })private int age;/** Indexed separately and in a group index with "age". */@QuerySqlField(index = true, orderedGroups = { @QuerySqlField.Group(name = "age_salary_idx", order = 3) })private double salary;}5.使用查詢實體配置索引索引和可查詢字段也可以通過org.apache.ignite.cache.QueryEntity便于基于 Spring XML 的配置的類進行配置 。
作為上面基于注釋的配置的一部分討論的所有概念也適用于QueryEntity基于方法 。此外,其字段配置了@QuerySqlField注解并注冊到CacheConfiguration.setIndexedTypes()方法的類型在內部轉換為查詢實體 。
下面的示例展示了如何定義單個字段索引、組索引和可查詢字段 。
CacheConfiguration<Long, Person> cache = new CacheConfiguration<Long, Person>("myCache");QueryEntity queryEntity = new QueryEntity();queryEntity.setKeyFieldName("id").setKeyType(Long.class.getName()).setValueType(Person.class.getName());LinkedHashMap<String, String> fields = new LinkedHashMap<>();fields.put("id", "java.lang.Long");fields.put("name", "java.lang.String");fields.put("salary", "java.lang.Long");queryEntity.setFields(fields);queryEntity.setIndexes(Arrays.asList(new QueryIndex("name"),new QueryIndex(Arrays.asList("id", "salary"), QueryIndexType.SORTED)));cache.setQueryEntities(Arrays.asList(queryEntity));在這種情況下,我們的表名將是Person(模式名稱的使用和定義在Schemas頁面上進行了解釋) 。
定義好之后,就QueryEntity可以按如下方式執行 SQL 查詢:
SqlFieldsQuery qry = new SqlFieldsQuery("SELECT id, name FROM Person" + "WHERE id > 1500 LIMIT 10");6.配置索引內聯大小適當的索引內聯大小可以幫助加快對索引字段的查詢 。有關如何選擇合適的內聯大小的信息,請參閱SQL 調優指南中的專門部分 。
在大多數情況下,您只需為可變長度字段(例如字符串或數組)上的索引設置內聯大小 。默認值為 10 。
您可以通過設置來更改默認值

  • 每個索引單獨的內聯大?。?或
  • CacheConfiguration.sqlIndexMaxInlineSize給定緩存中所有索引的屬性,或
  • IGNITE_MAX_INDEX_PAYLOAD_SIZE集群中所有索引的系統屬性
設置按上面列出的順序應用 。
您還可以單獨為每個索引配置內聯大?。?這將覆蓋默認值 。要為用戶定義的索引設置索引內聯大小,請使用以下方法之一 。在所有情況下,該值都以字節為單位 。
  • 使用注解時:
@QuerySqlField(index = true, inlineSize = 13)private String country;
  • 使用時QueryEntity:
QueryIndex idx = new QueryIndex("country");idx.setInlineSize(13);queryEntity.setIndexes(Arrays.asList(idx));
  • 如果您使用該CREATE INDEX命令創建索引,則可以使用該INLINE_SIZE選項設置內聯大?。?/li>
create index country_idx on Person (country) INLINE_SIZE 13;

推薦閱讀