В ранних версиях MySQL разработчики обычно хранили данные JSON в базе данных в виде строк, что приводило к неэффективным запросам и сложной обработке данных. Чтобы решить эту проблему, MySQL 8 представил собственный тип данных JSON, позволяющий нам структурировано хранить и запрашивать данные JSON.
MySQL 8 предоставляет ряд встроенных функций для управления и запроса данных JSON:
Следующие примеры показывают, как использовать каждую функцию:
Сначала мы создаем таблицу с именем json_example и вставляем фрагмент данных JSON:
CREATE TABLE json_example (
id INT AUTO_INCREMENT PRIMARY KEY,
data JSON
);
INSERT INTO json_example (data) VALUES (
'{
"name": "John Doe",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
},
"phoneNumbers": ["123-456-7890", "987-654-3210"],
"isActive": true
}'
);
В таблице json_example есть запись, содержащая данные JSON. Далее мы будем использовать различные функции JSON для запроса и изменения этих данных.
-- извлекать name Поле значения
SELECT JSON_EXTRACT(data, '$.name') AS extracted_name FROM json_example;
-- результат: "John Doe"
-- извлекать address объект из city Поле значения
SELECT JSON_EXTRACT(data, '$.address.city') AS city FROM json_example;
-- результат: "Anytown"
-- существовать phoneNumbers Вставьте новый номер телефона после многих
UPDATE json_example
SET data = JSON_INSERT(data, '$.phoneNumbers[2]', '555-123-4567');
-- в это время phoneNumbers становиться ["123-456-7890", "987-654-3210", "555-123-4567"]
-- заменять name Поле значения
UPDATE json_example
SET data = JSON_REPLACE(data, '$.name', 'Jane Smith');
-- в это время name становиться "Jane Smith"
-- Удалять phoneNumbers Первый номер телефона во многих серединаиз
UPDATE json_example
SET data = JSON_REMOVE(data, '$.phoneNumbers[0]');
-- в это время phoneNumbers становиться ["987-654-3210", "555-123-4567"]
-- создать новое из JSON множество
SELECT JSON_ARRAY('a', 1, TRUE);
-- результат: ["a", 1, true]
-- создать новое из JSON объект
SELECT JSON_OBJECT('key1', 'value1', 'key2', 2);
-- результат: {"key1": "value1", "key2": 2}
JSON_LENGTH() - получать JSON Документ или множество длины.
sql
-- получать phoneNumbers множествоиздлина
SELECT JSON_LENGTH(data->'$.phoneNumbers') AS phone_numbers_length FROM json_example;
-- результат: 2 (потому что phoneNumbers многие сейчас существуют, имеет два элемента)
-- Получить все ключи объекта JSON
SELECT JSON_KEYS(data) AS object_keys FROM json_example;
-- результат: ["name", "age", "address", "phoneNumbers", "isActive"]
-- проверять data Содержит ли столбец действительные JSON
SELECT JSON_VALID(data) AS is_valid_json FROM json_example;
-- результат: 1 (поверхность Показывать правда, потому что data Столбец содержит действительные из JSON)
Предположим, что в таблице json_example есть такой фрагмент данных.
INSERT INTO json_example (data) VALUES (
'{
"name": "John",
"interests": ["reading", "music"],
"friends": [
{"name": "Alice", "age": 28},
{"name": "Bob", "age": 32}
]
}'
);
Теперь мы будем использовать вышеуказанную функцию для работы с этим фрагментом данных:
-- использовать JSON_QUOTE Преобразовать обычную строку в JSON нить
SELECT JSON_QUOTE('Hello, World!') AS quoted_string;
-- результат: ""Hello, World!""
-- использовать JSON_UNQUOTE Воля JSON Преобразовать нить обратно в обычную нить
SELECT JSON_UNQUOTE('"Hello, World!"') AS unquoted_string;
-- результат: Hello, World!
Обратите внимание, что при использовании этих функций для реальных столбцов данных вы обычно работаете с сохраненными значениями JSON или значениями, которые необходимо вставить.
-- исследовать interests Многие ли содержат "reading"
SELECT JSON_CONTAINS(data->'$.interests', '"reading"') AS contains_reading FROM json_example;
-- результат: 1 (поверхность Показывать правда, потому что interests множество Включать "reading")
Обратите внимание: поскольку строки в JSON заключены в двойные кавычки, нам также необходимо добавить двойные кавычки к значению строки поиска при запросе.
-- исследовать Стоит ли сохранятьсуществовать friends множествосерединаизобъект из name путь
SELECT JSON_CONTAINS_PATH(data, 'one', '$.friends[*].name') AS contains_path FROM json_example;
-- результат: 1 (поверхность Показывать правда, потому чтожитьсуществовать Долженпуть)
-- К interests множестводобавление "traveling"
UPDATE json_example
SET data = JSON_SET(data, '$.interests[2]', 'traveling');
-- Примечание: здесь используйте JSON_SET, потому что JSON_ARRAY_APPEND нуждатьсяобозначениепутьконкретномумножество
-- существовать MySQL 8.0.17 и вышесередина,Можетиспользовать JSON_ARRAY_APPEND Добавляйте элементы правильно
-- Например: JSON_ARRAY_APPEND(data, '$.interests', 'traveling')
Примечание. В приведенном выше примере вместо JSON_ARRAY_APPEND используется JSON_SET, поскольку до MySQL 8.0.17 синтаксис JSON_ARRAY_APPEND немного отличался и требовал указания пути к определенному элементу массива. Начиная с версии 8.0.17, JSON_ARRAY_APPEND корректно добавляется в конец массива.
правильный JSON_ARRAY_APPEND Использование следующее:
-- К interests множестводобавление «путешествие» (относится к MySQL 8.0.17 и более поздние версии)
UPDATE json_example
SET data = JSON_ARRAY_APPEND(data, '$.interests', 'traveling');
-- существовать interests множество вставить на первую позицию "gaming"
UPDATE json_example
SET data = JSON_ARRAY_INSERT(data, '$.interests[0]', 'gaming');
-- результат: interests множествосейчассуществоватьда ["gaming", "reading", "music", "traveling"]
Чтобы улучшить производительность запросов, MySQL 8 поддерживает индексацию столбцов JSON. Однако из-за гибкости данных JSON прямая индексация всего документа JSON неэффективна. Поэтому MySQL вводит концепцию виртуальных столбцов (Virtual Columns).
На основе приведенной выше таблицы json_example давайте рассмотрим создание индекса для поля json.
Мы добавим фиктивный столбец с именем first_interest, в котором будет храниться первый элемент массива интересов.
ALTER TABLE json_example
ADD first_interest VARCHAR(255) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(data, '$.interests[0]'))) VIRTUAL;
Здесь мы используем JSON_EXTRACT(), чтобы получить первый элемент массива интересов, и используем JSON_UNQUOTE(), чтобы удалить кавычки, поскольку JSON_EXTRACT() возвращает строку в формате JSON.
CREATE INDEX idx_first_interest ON json_example(first_interest);
Теперь мы создаем индекс для столбца first_interest, который ускорит запросы на основе этого столбца.
Теперь мы можем выполнять запросы на основе столбца first_interest и использовать индекс для ускорения процесса запроса.
SELECT * FROM json_example WHERE first_interest = 'reading';
Поскольку мы создали индекс по first_interest, этот запрос будет более эффективным. Однако обратите внимание, что этот подход работает только для запроса первого элемента массива интересов. Если вам нужно запросить другие элементы массива, вам может потребоваться применить другие стратегии, например, использовать полнотекстовый поиск, инвертированные индексы или нормализовать данные JSON в реляционную структуру.
Тип данных JSON MySQL 8 обеспечивает мощную поддержку хранения и запроса данных JSON. Благодаря встроенным функциям JSON и индексам виртуальных столбцов разработчики могут эффективно обрабатывать данные JSON для удовлетворения потребностей современных приложений. Если вы разрабатываете приложения, которым необходимо хранить и запрашивать данные JSON, рассмотрите возможность использования возможностей JSON MySQL 8 для упрощения вашей работы.
Навыки обновляются благодаря обмену ими, и каждый раз, когда я получаю новые знания, мое сердце переполняется радостью. Искренне приглашаем вас подписаться на публичный аккаунт 『
Код на тридцать пять
』 , для получения дополнительной технической информации.