次の例を検討してください。オンライン書店のDBを構築しているとしましょう。Bookテーブルにはn個のレコードが含まれ、Typeテーブルにはm個のレコードが含まれています。nは非常に大きな数です。mは小さいです。
--------
Book
---------
BookId
BookName
BookType
---------
-------
Type
--------
TypeId
TypeName
---------
これらの2つのテーブルを結合する従来の方法は、BookTypeと呼ばれる3番目のテーブルを作成することです。
----------
BookType
----------
BookTypeId
BookId
TypeId
----------
タイプのある本のレコードを取得する場合は、次のようにします。
select B.*, T.Name from Book B
inner join BookType BT on B.BookId = BT.BookId
inner join Type T on BT.TypeId = T.TypeId
Bookテーブルは非常に大きいため、BookTypeテーブルはさらに大きくなります。DBインデックスはBツリーのようなアルゴリズムを使用しているため、時間コストは2log(n)+Cmになります。右?(BookテーブルとBookTypeテーブルにインデックスが付けられています)
ただし、TypeIdをJSON配列として保存し、それを結合に使用できる場合は、1回のトリップでデータを取得できます。時間はlog(n)+ Cmで、少なくとも2倍の速さです。構文は次のようになります。
select B.*, T.Name from Book B
inner join Type T on ParseJsonAsIntArray(BookType) = T.TypeId
ParseJsonAsIntArray()のようなMySQL関数が見つかりませんでした。なぜ彼らはこれをしないのですか?明らかなことを見逃してしまったらお詫びします。