Query-Performance
如何在 Mariadb 中有效地模擬 JSON_TABLE?
我沒有現成的 MySql,但據我了解,在 MySql 中實現我想要的最佳方法是使用
JSON_TABLE
. 此外,據我了解,JSON_TABLE
目前正在非常積極地進行工作,這減少了為此切換到 MySql 的願望。我有一個解決查詢的方法,它給了我想要的東西,但想知道它是否是最有效的方法。
create table natural_numbers (primary key (n)) with recursive nn as ( select 0 as n union select n + 1 from nn where nn.n < 100 ) select * from nn; with all_values as ( select json_value(pr.record_data, concat('$.*.A.B.C[',nn.n,'].D.*')) x from xxx pr cross join natural_numbers nn ) select * from all_values a where a.x is not null ;
我對此的擔憂是我正在建構比我需要的更多的行,然後過濾掉空值。在這種特定情況下,我認為它不太可能有超過 6 個元素,因此我可能能夠將過程限制為最多 6 行,但一般推薦的方法是什麼而不對最大元素數。
我正在玩弄我的查詢並想出了這個。它比我以前的要快得多。如此之多,以至於我認為這可能是做此類事情的最佳方法。
with recursive array_values as ( select json_extract(pr.record_data, '$.*.A.B.C[*].D.*') val , pr.id , json_length(json_extract(pr.record_data, '$.*.A.B.C[*].D.*')) n from xxx pr ), rec_elems as ( select av.id, 0 as i, json_value(av.val, '$[0]') val from array_values av where av.n > 0 is not null union all select av.id, e.i + 1, json_value(av.val, concat('$[', e.i + 1, ']')) from array_values av inner join rec_elems e on av.id = e.id where (i + 1) < av.n ) select * from rec_elems
我會暫時不接受答案,以防其他人可以提供替代方案。