為了讓導覽大型文件集合更有效率,您可以根據集合中文件中的一個或多個欄位建立索引。本節說明如何索引集合。
集合索引是普通的 MySQL 索引,建立在虛擬欄位上,這些虛擬欄位會從集合中的文件中擷取資料。由於 MySQL 無法直接為 JSON 值建立索引,若要啟用集合的索引,您必須提供一個 JSON 文件,其中指定要由索引使用的文件欄位。您將定義索引的 JSON 文件作為 Collection.createIndex( 方法的 name, IndexDefinition)IndexDefinition 參數傳遞。此通用範例 (實際語法可能因不同的程式設計語言而異) 顯示如何根據欄位 count 建立強制性整數類型索引。
myCollection.createIndex("count", {fields:[{"field": "$.count", "type":"INT", required:true}]});
此範例顯示如何根據文字欄位建立索引:在此案例中為郵遞區號。對於文字欄位,您必須指定索引的前置長度,這是 MySQL Server 所要求的。
myCollection.createIndex("zip", {fields: [{field: "$.zip", type: "TEXT(10)"}]})
請參閱定義索引,以取得有關 IndexDefinition 格式和支援索引的欄位類型的資訊。
如果已存在相同名稱的索引,或索引定義格式不正確,Collection.createIndex() 方法會失敗並產生錯誤。name 參數為必要參數,且必須是 SQL 語句 CREATE INDEX 接受的有效索引名稱。
若要移除現有索引,請使用 collection.dropIndex(string name) 方法。這會刪除具有傳遞名稱的索引,如果指定的索引不存在,則作業會靜默地成功。
集合的索引會儲存為虛擬欄位。若要驗證建立的索引,請使用 SHOW INDEX 語句。例如,從 MySQL Shell 使用此 SQL。
session.runSql('SHOW INDEX FROM mySchema.myCollection');
若要根據集合中的文件建立索引,您需要建立一個 IndexDefinition JSON 文件。本節說明您可以在此類 JSON 文件中使用的有效欄位,以定義索引。
若要定義要建立集合索引的文件欄位,該欄位的類型在整個集合中必須一致。換句話說,類型必須一致。用於定義索引的 JSON 文件 (例如 {fields: [{field: '$.username', type: 'TEXT'}]}) 可以包含下列內容:
-
fields:至少一個IndexField物件的陣列,其中每個物件描述要包含在索引中的 JSON 文件欄位。單一
IndexField描述包含下列欄位:field:一個字串,其中包含要索引的文件成員或欄位的完整文件路徑。type:一個字串,代表將欄位對應至的支援欄位類型之一 (請參閱欄位資料類型)。對於數值類型,可以選擇性地加上UNSIGNED關鍵字。對於TEXT類型,您必須定義要考慮索引的長度 (前置長度)。required:一個選擇性的布林值,如果文件必須存在該欄位,則應將其設定為true。對於除了預設值為true的GEOJSON以外的所有類型,預設值為false。options:一個選擇性的整數,當解碼GEOJSON資料時,會用作特殊選項旗標 (如需詳細資訊,請參閱ST_GeomFromGeoJSON()的說明)。srid:一個選擇性的整數,當解碼GEOJSON資料時,會用作 srid 值 (如需詳細資訊,請參閱ST_GeomFromGeoJSON()的說明)。-
array:一個選擇性的布林值,如果欄位包含陣列,則設定為true。預設值為false。如需詳細資訊,請參閱索引陣列欄位。重要事項對於 MySQL 8.0.16 和更早版本,索引中不支援 JSON 陣列的欄位;指定包含陣列資料的欄位不會從伺服器產生錯誤,但索引無法正確運作。
type:一個選擇性的字串,定義索引的類型。值為INDEX或SPATIAL其中之一。預設值為INDEX,並且可以省略。
在 IndexDefinition 或 IndexField JSON 文件中包含任何其他未在以上描述的欄位,會導致 collection.createIndex() 失敗並產生錯誤。
如果未指定索引類型,或設定為 INDEX,則建立的結果索引會與發出 CREATE INDEX 所建立的方式相同。如果索引類型設定為 SPATIAL,則建立的索引與使用 SPATIAL 關鍵字發出 CREATE INDEX 所建立的索引相同,請參閱SPATIAL 索引最佳化和建立空間索引。例如:
myCollection.createIndex('myIndex', //
{fields: [{field: '$.myGeoJsonField', type: 'GEOJSON', required: true}], type:'SPATIAL'})
使用 SPATIAL 類型的索引時,IndexField 項目中的 required 欄位不能設定為 false。
以下是以多個欄位為基礎建立索引的範例:
myCollection.createIndex('myIndex', {fields: [{field: '$.myField', type: 'TEXT'}, //
{field: '$.myField2', type: 'TEXT(10)'}, {field: '$.myField3', type: 'INT'}]})
索引欄位的值會使用標準 MySQL 類型轉換 (請參閱運算式評估中的類型轉換) 從 JSON 轉換為 IndexField 描述中指定的類型,但 GEOJSON 類型除外,該類型會使用 ST_GeomFromGeoJSON() 函數進行轉換。這表示當在 IndexField 描述中使用數值類型時,非數值的實際欄位值會轉換為 0。
只有當 type 設定為 GEOJSON 時,IndexField 中的 options 和 srid 欄位才能存在。如果存在,則在將 GEOJSON 資料轉換為 MySQL 原生 GEOMETRY 值時,會將它們用作 ST_GeomFromGeoJSON() 的參數。
文件欄位支援下列資料類型。在 type 欄位中使用時,類型名稱會區分大小寫。
INT[UNSIGNED]TINYINT[UNSIGNED]SMALLINT[UNSIGNED]MEDIUMINT[UNSIGNED]INTEGER[UNSIGNED]BIGINT[UNSIGNED]REAL[UNSIGNED] (實數 [無符號])FLOAT[UNSIGNED] (浮點數 [無符號])DOUBLE[UNSIGNED] (雙精度浮點數 [無符號])DECIMAL[UNSIGNED] (十進位數 [無符號])NUMERIC[UNSIGNED] (數值 [無符號])GEOJSON(額外選項: options, srid) (GEOJSON (額外選項:選項、srid))
X DevAPI 支援根據陣列欄位建立索引,方法是在 IndexField 描述中將布林值 array 欄位設定為 true。例如,要在 emails 陣列欄位上建立索引
collection.createIndex("emails_idx", //
{fields: [{"field": "$.emails", "type":"CHAR(128)", "array": true}]});
以下限制適用於根據陣列建立索引