MySQL JSON 數據類型用法及與傳統JSON字符串的對比 JSON數據類型簡介

文章目錄

  • 前言
    • 1. 基本用法
  • JSON數據類型 vs 傳統JSON字符串
    • 1. 存儲方式
    • 2. 查詢方式對比
    • 3. 索引支持
  • JSON存儲對象和數組的性能考慮
    • 1. 存儲對象
    • 2. 存儲數組
  • 性能對比總結
  • 最佳實踐建議


在這里插入圖片描述

前言

MySQL從 5.7 版本開始引入了 JSON 數據類型,專門用于存儲 JSON 格式的數據。與傳統的將 JSON 作為字符串存儲在 VARCHARTEXT 字段中相比,JSON 數據類型提供了更好的存儲效率和查詢性能。

1. 基本用法

-- 創建包含JSON字段的表
CREATE TABLE products (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),attributes JSON,json_string TEXT
);-- 插入JSON數據
INSERT INTO products (name, attributes, json_string) VALUES ('Laptop','{"brand": "Dell", "specs": {"cpu": "i7", "ram": "16GB"}, "tags": ["electronics", "computer"]}','{"brand": "Dell", "specs": {"cpu": "i7", "ram": "16GB"}, "tags": ["electronics", "computer"]}'
);

JSON數據類型 vs 傳統JSON字符串

1. 存儲方式

  • JSON數據類型:以優化的二進制格式存儲,解析后的結構
  • 傳統JSON字符串:純文本存儲,需要每次使用時解析

2. 查詢方式對比

使用LIKE查詢傳統JSON字符串

-- 查詢品牌為Dell的產品(傳統JSON字符串方式)
SELECT * FROM products WHERE json_string LIKE '%"brand": "Dell"%';

這種方式的缺點:

  • 無法使用索引
  • 可能產生誤匹配(如值中包含相同字符串)
  • 性能差,需要全表掃描

使用JSON函數查詢JSON數據類型

-- 查詢品牌為Dell的產品(JSON數據類型方式)
SELECT * FROM products WHERE JSON_EXTRACT(attributes, '$.brand') = 'Dell';
-- 或使用箭頭語法(MySQL 8.0+)
SELECT * FROM products WHERE attributes->'$.brand' = '"Dell"';

優點:

  • 可以使用生成的列和索引
  • 精確查詢,不會誤匹配
  • 性能更好

3. 索引支持

JSON字段可以通過生成列添加索引:

-- 為JSON字段的brand屬性創建索引
ALTER TABLE products ADD COLUMN brand VARCHAR(50) GENERATED ALWAYS AS (JSON_UNQUOTE(attributes->'$.brand')) STORED;
CREATE INDEX idx_brand ON products(brand);

JSON存儲對象和數組的性能考慮

1. 存儲對象

{"brand": "Dell","specs": {"cpu": "i7","ram": "16GB"}
}
  • 查詢性能:直接訪問嵌套屬性比傳統JSON字符串解析快得多
  • 索引:可以為嵌套屬性創建索引(通過生成列)

2. 存儲數組

{"tags": ["electronics", "computer", "laptop"]
}
  • 查詢包含特定元素的數組
SELECT * FROM products WHERE JSON_CONTAINS(attributes->'$.tags', '"electronics"');
  • 性能考慮
    • 數組查詢通常比簡單屬性查詢慢
    • 大數組可能影響性能
    • 考慮將頻繁查詢的數組元素提取到單獨的表中

性能對比總結

特性JSON數據類型傳統JSON字符串
存儲效率
查詢性能
索引支持支持不支持
復雜查詢能力
嵌套對象訪問性能
數組操作性能
數據驗證

最佳實踐建議

  1. 對于需要頻繁查詢的JSON屬性,考慮提取為單獨的列并建立索引
  2. 避免在JSON中存儲過大的數組
  3. MySQL 8.0+對JSON支持更好,優先使用新版本
  4. 對于簡單鍵值對,考慮使用傳統的關系型設計而非JSON
  5. 使用JSON_VALID()約束確保數據完整性

JSON數據類型在大多數場景下都比傳統JSON字符串存儲方式性能更好,特別是在查詢和索引支持方面。但對于簡單應用或不需要查詢JSON內容的情況,傳統字符串方式可能更簡單。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92457.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++:list(1)list的使用

list的使用一.list基本的結構1.環狀雙向鏈表2.哨兵節點3.迭代器4.節點結構5.鏈表遍歷6.迭代器失效二.list的基本使用1.test01函數:主要測試std::list的初始化方式及遍歷2.test02函數:主要測試std::list的常用成員函數操作3.測試結果如下三.list的其他操作…

ArcGIS地形起伏度計算

地形起伏度計算地形起伏度步驟1:計算最大值。步驟2:計算最小值。步驟3:計算地形起伏度。地形起伏度、地形粗糙度、地表切割深度和高程變異系數均為坡面復雜度因子,是一種宏觀的地形信息因子,反映的是較大的區域內地表坡…

llama factory新手初步運行完整版

1、新建conda環境名稱為llama_factory,并激活 conda create -n llama_factory python3.10 conda activate llama_factory2、激活后可檢查內部包是否純凈,要確保環境內包較純凈,不然后續安裝對應包會出現一系列水土不服的問題,導致…

Tomcat與JDK版本對照全解析:避坑指南與生產環境選型最佳實踐

💝💝💝歡迎蒞臨我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 持續學習,不斷…

短視頻矩陣的未來前景:機遇無限,挑戰并存

在當今數字化信息飛速傳播的時代,短視頻以其獨特的魅力迅速席卷全球,成為人們獲取信息、娛樂消遣的重要方式之一。短視頻矩陣作為一種高效的內容傳播與運營模式,正逐漸展現出其強大的影響力和潛力。本文將深入探討短視頻矩陣的未來前景&#…

【數據結構】哈希——位圖與布隆過濾器

目錄 位圖: 引入 位圖實現: 位圖的結構 插入數據(標記數據) 刪除數據(重置數據) 查找數據 位圖完整代碼: 位圖的優缺點: 布隆過濾器: 引入 布隆過濾器實現: 布隆過濾器的結構: 插入…

本地運行C++版StableDiffusion!開源應用StableVerce發布

本地運行C版StableDiffusion!開源應用StableVerce發布 StableVerse是一個用C開發的本地運行的圖形工具。適合初學者快速入門;適用于辦公室工作人員的文本和圖像制作的小規模計算能力場景。 開源地址:https://github.com/kelvin-luo/StableVer…

OpenLayers 快速入門(七)矢量數據

看過的知識不等于學會。唯有用心總結、系統記錄,并通過溫故知新反復實踐,才能真正掌握一二 作為一名摸爬滾打三年的前端開發,開源社區給了我飯碗,我也將所學的知識體系回饋給大家,助你少走彎路! OpenLayers…

【PTA數據結構 | C語言版】關于堆的判斷

本專欄持續輸出數據結構題目集,歡迎訂閱。 文章目錄題目代碼題目 將一系列給定數字順序插入一個初始為空的最小堆。隨后判斷一系列相關命題是否為真。命題分下列幾種: x is the root:x是根結點;x and y are siblings&#xff1a…

[CH582M入門第十步]藍牙從機

前言 學習目標: 1、初步了解BLE協議 2、BLE從機代碼解析 3、使用手機藍牙軟件控制CH582M從機LED亮滅一、藍牙介紹 藍牙(Bluetooth)是一種短距離無線通信技術,主要用于設備之間的數據傳輸和通信。它由愛立信(Ericsson)于1994年提出,現由藍牙技術聯盟(Bluetooth SIG)維…

力扣(LeetCode) ——輪轉數組(C語言)

題目:輪轉數組 給定一個整數數組 nums,將數組中的元素向右輪轉 k 個位置,其中 k 是非負數。 示例1: 輸入: nums [1,2,3,4,5,6,7],k 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右輪轉 1 步:…

Rocky9部署Zabbix7(小白的“升級打怪”成長之路)

目錄 一、關閉防火墻和SElinux和配置安裝源 二、zabbxi服務器配置 1、安裝Zabbix server,Web前端,agent ,mysql-server 2、配置mysql數據庫 3、為Zabbix server配置數據庫 4、啟動對應服務 三、登錄zabbix 四、客戶端部署 五、解決中…

python安裝package和pycharm更改環境變量

安裝numpy包 1、找到對應python版本的numpy包的版本 NumPy - News確認適配python版本的numpy,我安裝 的python是3.11所以安裝的numpy是2.2.0 2、修改pip安裝的鏡像源 1、全局修改: pip config set global.index-url https://pypi.tuna.tsinghua.edu.c…

Redis中的setnx命令為什么是原子性的

Redis的SETNX命令是一個原子性操作,這得益于其單線程架構的特性。Redis采用單線程模型,所有命令都在主線程中順序執行,確保每個操作都具有原子性。執行SETNX時,Redis會首先檢查指定key是否存在:若不存在則設置值并返回…

深入解析Hadoop中的EditLog與FsImage持久化設計及Checkpoint機制

HDFS元數據管理概述在HDFS(Hadoop Distributed File System)的架構中,元數據管理是保證系統可靠性和性能的核心環節。NameNode作為HDFS的主節點,負責維護整個文件系統的命名空間和文件到數據塊的映射關系。這些元數據的高效管理直…

MFC類Qt的自動布局框架

由于作者習慣使用Qt,習慣了其框架下的水平和垂直布局。但在使用MFC時,卻發現并沒有十分好用的布局框架,檢索了部分資料,發現要么不提供源碼,要么方案不理想。搜索了很多資料,最終發現一個可用方案&#xff…

認識Transformer架構

一.前言前面我們介紹了RNN相關系列的模型,在當今大模型時代大家認識一下就好了,而本章節我們是要來介紹一下重中之重的Transformer模型,本章節就來介紹一下他的架構,了解Transformer模型的作?以及了解Transformer總體架構圖中各個…

Python學習之存數據

在得到了對應的數據之后可以考慮用文件或者數據庫的方式把內容持久化下來方便之后的分析,此時可以使用pymongo庫,寥寥幾行代碼,數據就已經很好地存儲下來。(此處可參考我們之前發的文章)在 Python 中引入:import pymon…

PointLLM - ECCV 2024 Best Paper Candidate

https://github.com/OpenRobotLab/PointLLM PointLLM: Empowering Large Language Models to Understand Point Clouds 核心問題 對比兩種讓大型語言模型(LLM)“看懂”三維世界的方法 間接方法:通過2D圖像進行猜測。 這是目前比較常見但充…

前端-CSS-day6

目錄 1、相對定位 2、絕對定位 3、絕對定位-居中 4、固定定位 5、堆疊順序 6、CSS精靈-基本使用 7、案例-京東服務 8、字體圖標-體驗 9、使用字體圖標 10、垂直對齊方式 11、過渡 12、透明度 13、光標類型 14、綜合案例-輪播圖 1、相對定位 <!DOCTYPE html>…