為了更有效率地瀏覽大型文件集合,您可以根據集合中文件中的一個或多個欄位建立索引。本節說明如何為集合建立索引。
集合索引是普通的 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。除了GEOJSON之外,所有型別的預設值皆為false,GEOJSON的預設值為true。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 欄位中使用時,型別名稱不區分大小寫。
X DevAPI 支援透過在 IndexField 描述中將布林值 array 欄位設定為 true 來建立基於陣列欄位的索引。例如,要在 emails 陣列欄位上建立索引
collection.createIndex("emails_idx", //
{fields: [{"field": "$.emails", "type":"CHAR(128)", "array": true}]});
下列限制適用於建立基於陣列的索引