簡體   English   中英

如何使用 MySQL 8 在 JSON 陣列上創建索引

[英]How to create an index on a JSON array using MySQL 8

我在 mysql 8 中有一個 JSON 字段,如下所示:

[{"key": "apples", "string_values": ["red"]}, {"key": "oranges", "string_values": ["orange"]}]

有沒有辦法在字符串值上創建索引? 我希望我能做這樣的事情:

ALTER TABLE mytable ADD INDEX myindex( 
    (CAST(metadata->'$[*].string_values' AS UNSIGNED ARRAY)) 
);

但是,這會返回以下錯誤:Cannot store an array or an object in a scalar key part of the index

小提琴例如: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=ae36a5169094ae67a290febf09f49f0c

編輯:

我開始認為我能做到這一點的唯一方法是使用生成的列:

下面的 select 現在將命中索引。

ALTER TABLE mytable ADD string_values JSON AS (JSON_EXTRACT(metadata, '$[*].string_values[0]'));

ALTER TABLE mytable ADD INDEX idx_string_values( 
    (CAST(string_values->'$' AS CHAR(100) ARRAY))
);

SELECT * FROM mytable WHERE 'red' MEMBER OF(string_values->'$');

有2個不同的問題。


首先是可以解決的。 下一個小提琴描述了它:

 CREATE TABLE mytable (metadata JSON); INSERT INTO mytable VALUES ('[{"key": "apples", "string_values": ["red"]}, {"key": "oranges", "string_values": ["orange"]}]');
 -- you try to index arrays SELECT metadata->'$[*].string_values' FROM mytable; -- but you need in scalar values SELECT metadata->'$[*].string_values[0]' FROM mytable;
  | 元數據->'$[*].string_values' |  |:------------------ |  |  [[“紅色”],[“橙色”]] |  | 元數據->'$[*].string_values[0]' |  |:-------------------------------- |  |  [“紅色”,“橙色”] |

db<> 在這里擺弄


第二個問題無法解決。

仔細查看您嘗試創建索引時使用的語句:

ALTER TABLE mytable ADD INDEX myindex((CAST(metadata->'$[*].string_values' AS UNSIGNED ARRAY)));

數組["red", "orange"]中的值不是數字。

在回答之前,我應該做一個簡短的免責聲明。 在 SQL 數據庫中存儲 JSON 數據實際上違背了基本的 SQL 設計理念。 SQL,顧名思義,是用於結構化的,即強類型數據。 如果您將數據作為 JSON 傳遞給 SQL 數據庫,那么您實際上是在丟棄其結構並將其視為字符串。

因此,在這種情況下,我會首先考慮以下兩種選擇:

(A) 我可以將這些數據視為結構化數據嗎? 在這種情況下,我將創建一個表,其中列對應於 JSON 字段,然后為任何其他列創建索引。

(B) 我的數據基本上是非結構化的嗎? 在這種情況下,我會嘗試將 model 作為 SQL 中的鍵值對,或者使用非 SQL 數據庫,例如 CouchDB 或 Elasticsearch。

使用基於鍵值的方法,您可以將相關屬性分離到一個單獨的表中(對於將是鍵/索引/值的數組),然后您可以將其用於索引。 這當然會增加一些開銷,根據具體情況,在您的情況下可能會或可能不會接受。

但是,仍然有許多合理的原因可能無法將某事歸類為 A 或 B。如果您已經考慮並嘗試了這兩種方法,並且您可以清楚地證明為什么您的案例是例外的:

(C) 閱讀有關索引生成列的 MySQL 文檔

即使這樣,您可能仍需要重新建模您的 JSON 數據,例如將數組轉換為單個條目(id/index/value)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM