欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL JSON查詢與索引詳解

 更新時間:2025年11月10日 16:17:47   作者:憤怒的蘋果ext  
本文給大家介紹了MySQL JSON查詢與索引的相關知識,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

前言

  • 自MySQL 5.7.8開始引入原生JSON支持,可用于存儲動態(tài)的列。此時如果想要建立索引,要先建立JSON某一列的虛擬列,使用虛擬列查詢。從MySQL 8.0.17開始,InnoDB支持多值索引,相比老版本的查詢方式就更直接了。

準備

  • 創(chuàng)建一張配置表,建表語句如下。
CREATE TABLE `t_config` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `extras` json DEFAULT NULL COMMENT '擴展列json字段',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='配置表';
  • 測試數(shù)據(jù)
INSERT INTO `t_config` (`id`, `extras`) VALUES (1, '{\"color\": \"red\", \"phone\": [\"157\", \"153\"]}');
INSERT INTO `t_config` (`id`, `extras`) VALUES (2, '{\"color\": \"green\", \"phone\": [\"157\", \"154\"]}');
  • 下面就開始介紹虛擬列多值索引查詢與索引方式。

虛擬列

測試平臺5.7.26

查詢

SELECT * FROM `t_config` WHERE extras->'$.color' = 'red';
或
SELECT * FROM `t_config` WHERE json_contains(extras->'$.color','"red"');

現(xiàn)在是走全表掃描

下面創(chuàng)建虛擬列和索引

ALTER TABLE `t_config`
ADD COLUMN `v_color` VARCHAR(32) GENERATED ALWAYS AS
(JSON_UNQUOTE(JSON_EXTRACT(`extras`, _utf8mb4'$.color'))) VIRTUAL NULL;
CREATE INDEX idx_v_color on t_config(v_color);

查詢就能走索引了

EXPLAIN SELECT * FROM `t_config` WHERE v_color = 'red';

但是數(shù)組phone未找到合適的方式查詢。

多值索引

測試平臺8.0.43

查詢(第二條語句不能利用索引)

SELECT * FROM `t_config` WHERE json_contains(extras->'$.color','"red"');
 或者
SELECT * FROM `t_config` WHERE extras->'$.color' = 'red';  

當前是全表掃描

EXPLAIN SELECT * FROM `t_config` WHERE json_contains(extras->'$.color','"red"');

增加json里 color字段索引

alter table t_config add index json_color( (cast(extras->'$.color' as char(32) array)));

現(xiàn)在就能走索引了

  • 對于數(shù)字數(shù)組字段,查詢方式
  • 要先創(chuàng)建索引,才能查到數(shù)據(jù)
alter table t_config add index phone( (cast(extras->'$.phone' as unsigned array)) );
 -- 查詢phone字段
 SELECT * FROM `t_config` WHERE json_contains(extras->'$.phone' , '157');
-- 查詢phone字段, 參數(shù)數(shù)組
 SELECT * FROM `t_config` WHERE json_contains(extras->'$.phone' , CAST('[157,153]' AS JSON));

能走索引

總結

  • 從執(zhí)行計劃看,虛擬列的索引執(zhí)行計劃更優(yōu),但利用多值索引的json_contains查詢方式就不需要轉換SQL。
  • 數(shù)組列:虛擬列暫未找到查詢數(shù)組的方式。多值索引要先創(chuàng)建才能查到數(shù)據(jù)。

參考

到此這篇關于MySQL JSON查詢與索引的文章就介紹到這了,更多相關mysql json索引內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Ubuntu下mysql安裝和操作圖文教程

    Ubuntu下mysql安裝和操作圖文教程

    這篇文章主要為大家詳細分享了Ubuntu下mysql安裝和操作圖文教程,喜歡的朋友可以參考一下
    2016-05-05
  • 值得收藏的mysql常用命令集錦

    值得收藏的mysql常用命令集錦

    這篇文章主要為大家整理了mysql常用命令匯總,連接Mysql、修改mysql密碼、數(shù)據(jù)庫的創(chuàng)建刪除等,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Mysql查詢去空格的多種方法匯總

    Mysql查詢去空格的多種方法匯總

    SQL查詢語句中空格是用來分隔關鍵字、表名、列名等的,然而空格也會影響查詢效率,因為查詢語句中的空格越多,查詢的速度就越慢,下面這篇文章主要給大家介紹了關于Mysql查詢去空格的多種方法,需要的朋友可以參考下
    2023-04-04
  • MySQL錯誤“Data?too?long”的原因、解決方案與優(yōu)化策略

    MySQL錯誤“Data?too?long”的原因、解決方案與優(yōu)化策略

    MySQL作為重要的數(shù)據(jù)庫系統(tǒng),在數(shù)據(jù)插入時可能遇到“Data?too?long?for?column”錯誤,本文探討了該錯誤的原因、解決方案及預防措施,如調整字段長度、使用TEXT類型等,旨在優(yōu)化數(shù)據(jù)庫設計,提升性能和用戶體驗,需要的朋友可以參考下
    2024-09-09
  • MySQL在哪些情況下不使用索引的示例

    MySQL在哪些情況下不使用索引的示例

    盡管索引可以顯著提高數(shù)據(jù)庫的查詢性能,但在某些情況下,MySQL可能不會使用索引,本文就來介紹一下MySQL在哪些情況下不使用索引,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Mysql數(shù)據(jù)類型與CRUD操作詳細講解

    Mysql數(shù)據(jù)類型與CRUD操作詳細講解

    這篇文章主要介紹了Mysql數(shù)據(jù)類型與CRUD操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • mysql數(shù)據(jù)庫遷移至Oracle數(shù)據(jù)庫

    mysql數(shù)據(jù)庫遷移至Oracle數(shù)據(jù)庫

    這篇文章主要為大家詳細介紹了mysql數(shù)據(jù)庫遷移至Oracle數(shù)據(jù)庫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Mysql字符集和排序規(guī)則詳解

    Mysql字符集和排序規(guī)則詳解

    這篇文章主要介紹了Mysql字符集和排序規(guī)則詳解,在mysql中存儲的是字符串數(shù)據(jù),那么這些數(shù)據(jù)到底在Mysql中如何存儲呢?這就涉及到字符集的概念,接下來我們一起進入文章學習詳細內容介紹吧
    2022-09-09
  • navicat 8 for mysql建庫的方法

    navicat 8 for mysql建庫的方法

    在本篇文章里小編給大家分享的是關于navicat 8 for mysql建庫的方法以及相關知識點,需要的朋友們參考學習下。
    2019-08-08
  • mysql仿asp的數(shù)據(jù)庫操作類

    mysql仿asp的數(shù)據(jù)庫操作類

    本文通過實例代碼給大家介紹了mysql仿asp的數(shù)據(jù)庫操作類,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2008-04-04

最新評論