1. 程式人生 > >MySQL · 最佳實踐 · 如何索引JSON欄位

MySQL · 最佳實踐 · 如何索引JSON欄位

概述

MySQL從5.7.8起開始支援JSON欄位,這極大的豐富了MySQL的資料型別。也方便了廣大開發人員。但MySQL並沒有提供對JSON物件中的欄位進行索引的功能,至少沒有直接對其欄位進行索引的方法。本文將介紹利用MySQL 5.7中的虛擬欄位的功能來對JSON物件中的欄位進行索引。

示例資料

我們將基於下面的JSON物件進行演示

{
    "id": 1,  
    "name": "Sally",  
    "games_played":{    
       "Battlefield": {
          "weapon": "sniper rifle",
          "rank": "Sergeant V",
          "level": 20
        },                                                                                                                          
       "Crazy Tennis": {
          "won": 4,
          "lost": 1
        },  
       "Puzzler": {
          "time": 7
        }
     }
 }

表的基本結構


CREATE TABLE `players` (  
    `id` INT UNSIGNED NOT NULL,
    `player_and_games` JSON NOT NULL,
    PRIMARY KEY (`id`)
);

如果只是基於上面的表的結構我們是無法對JSON欄位中的Key進行索引的。接下來我們演示如何藉助虛擬欄位對其進行索引

增加虛擬欄位

虛擬列語法如下

<type> [ GENERATED ALWAYS ] AS ( <expression> ) [ VIRTUAL|STORED ]
[ UNIQUE [KEY] ] [ [PRIMARY] KEY ] [ NOT NULL ] [ COMMENT <text> ]

在MySQL 5.7中,支援兩種Generated Column,即Virtual Generated Column和Stored Generated Column,前者只將Generated Column儲存在資料字典中(表的元資料),並不會將這一列資料持久化到磁碟上;後者會將Generated Column持久化到磁碟上,而不是每次讀取的時候計算所得。很明顯,後者存放了可以通過已有資料計算而得的資料,需要更多的磁碟空間,與Virtual Column相比並沒有優勢,因此,MySQL 5.7中,不指定Generated Column的型別,預設是Virtual Column。

原文連結