Введение
В этой лабораторной работе вы научитесь эффективно использовать тип данных JSON в MySQL. Вы выполните основные операции, такие как вставка JSON-документов, запрос конкретных полей с использованием функций, таких как JSON_EXTRACT и оператора ->>, изменение данных в столбце JSON, а также оптимизация запросов путем создания индекса по свойству JSON.
В ходе этой лабораторной работы вы подключитесь к серверу MySQL, создадите выделенную базу данных и таблицу, а затем выполните серию практических задач для развития навыков управления данными JSON в контексте реляционной базы данных.
Подключение к MySQL и создание базы данных
На этом первом этапе вы подключитесь к серверу MySQL и настроите базу данных и таблицу, необходимые для лабораторной работы.
Сначала откройте терминал на вашем рабочем столе.
Подключитесь к серверу MySQL с привилегиями пользователя root. В этой лабораторной среде sudo позволяет подключаться без пароля.
sudo mysql -u root
После подключения командная строка изменится на mysql>, что означает, что вы находитесь в оболочке MySQL.
Далее создайте новую базу данных с именем jsondb. Предложение IF NOT EXISTS гарантирует, что команда выполнится без ошибок, если база данных уже существует.
CREATE DATABASE IF NOT EXISTS jsondb;
Теперь переключитесь на только что созданную базу данных, чтобы сделать ее активной для последующих команд.
USE jsondb;
Наконец, создайте таблицу с именем products. Эта таблица будет включать столбец с типом данных JSON для хранения подробной информации о продукте.
CREATE TABLE IF NOT EXISTS products (
id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(255),
product_details JSON
);
Это утверждение определяет таблицу с тремя столбцами:
id: Уникальное целое число с автоинкрементом для каждой записи.product_name: Строка для названия продукта.product_details: СтолбецJSONдля хранения структурированных данных.
Вы успешно настроили необходимую базу данных и таблицу. Оставьте оболочку MySQL открытой для следующего шага.
Вставка и запрос данных JSON
После создания таблицы вы вставите запись, содержащую JSON-документ, а затем выполните базовый запрос для его получения.
В той же оболочке MySQL выполните следующую команду INSERT для добавления нового продукта.
INSERT INTO products (product_name, product_details) VALUES (
'Laptop',
'{
"brand": "Dell",
"model": "XPS 13",
"specs": {
"processor": "Intel Core i7",
"memory": "16GB",
"storage": "512GB SSD"
},
"price": 1200
}'
);
Эта команда вставляет запись 'Laptop'. Столбец product_details заполняется JSON-объектом, который включает вложенные данные, такие как specs.
Чтобы убедиться, что данные были вставлены правильно, выполните запрос к таблице products, чтобы просмотреть ее содержимое.
SELECT * FROM products;
Вывод должен отобразить только что вставленную строку. Обратите внимание, как JSON-данные хранятся в столбце product_details.
+----+--------------+--------------------------------------------------------------------------------------------------------------------------------+
| id | product_name | product_details |
+----+--------------+--------------------------------------------------------------------------------------------------------------------------------+
| 1 | Laptop | {"brand": "Dell", "model": "XPS 13", "price": 1200, "specs": {"memory": "16GB", "storage": "512GB SSD", "processor": "Intel Core i7"}} |
+----+--------------+--------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Вы успешно вставили запись с данными JSON. На следующем шаге вы научитесь извлекать конкретную информацию из этого JSON-объекта.
Извлечение данных из полей JSON
Хранение данных в формате JSON полезно, но также необходимо уметь запрашивать отдельные поля внутри него. На этом этапе вы будете использовать функции JSON_EXTRACT и JSON_UNQUOTE для извлечения конкретных значений из столбца product_details.
Функция JSON_EXTRACT позволяет выбрать значение из JSON-документа, используя выражение пути. Путь начинается с $ для представления корневого элемента документа.
Извлечем brand ноутбука.
SELECT JSON_EXTRACT(product_details, '$.brand') AS brand FROM products WHERE product_name = 'Laptop';
Этот запрос возвращает бренд, но обратите внимание, что результат представляет собой JSON-строку, включающую двойные кавычки.
+--------+
| brand |
+--------+
| "Dell" |
+--------+
1 row in set (0.00 sec)
Для получения более чистого результата вы можете использовать JSON_UNQUOTE в сочетании с JSON_EXTRACT. Эта комбинация извлекает значение и удаляет кавычки, возвращая стандартную строку.
SELECT JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.brand')) AS brand FROM products WHERE product_name = 'Laptop';
Теперь вывод представляет собой обычный текст Dell.
+-------+
| brand |
+-------+
| Dell |
+-------+
1 row in set (0.00 sec)
Вы также можете использовать выражения пути для доступа к значениям во вложенных объектах. Чтобы получить processor из объекта specs, используйте путь $.specs.processor.
SELECT JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.specs.processor')) AS processor FROM products WHERE product_name = 'Laptop';
Это правильно извлечет вложенное значение.
+-----------------+
| processor |
+-----------------+
| Intel Core i7 |
+-----------------+
1 row in set (0.00 sec)
Эти функции также полезны в предложениях WHERE для фильтрации строк. Чтобы найти все продукты с ценой выше 1000, вам необходимо CAST (преобразовать) извлеченное значение JSON в числовой тип для сравнения.
SELECT product_name, JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.price')) AS price FROM products WHERE CAST(JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.price')) AS SIGNED) > 1000;
Этот запрос демонстрирует, как фильтровать записи на основе числового значения внутри поля JSON.
+--------------+-------+
| product_name | price |
+--------------+-------+
| Laptop | 1200 |
+--------------+-------+
1 row in set (0.00 sec)
Теперь вы знаете, как извлекать и фильтровать данные на основе полей JSON.
Обновление и добавление полей JSON
Данные со временем меняются, и вам нужен способ изменять JSON-документы, хранящиеся в вашей базе данных. На этом этапе вы будете использовать функцию JSON_SET для обновления существующих значений и добавления новых пар ключ-значение.
Функция JSON_SET изменяет JSON-документ, принимая в качестве аргументов целевой столбец, путь к полю и новое значение.
Сначала обновим price ноутбука с 1200 до 1250.
UPDATE products
SET product_details = JSON_SET(product_details, '$.price', 1250)
WHERE product_name = 'Laptop';
Чтобы проверить изменение, снова запросите цену.
SELECT JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.price')) AS price FROM products WHERE product_name = 'Laptop';
Вывод теперь должен показать новую цену.
+-------+
| price |
+-------+
| 1250 |
+-------+
1 row in set (0.00 sec)
Если указанный путь не существует, JSON_SET добавит новый ключ и значение. Добавим свойство color к продукту.
UPDATE products
SET product_details = JSON_SET(product_details, '$.color', 'Silver')
WHERE product_name = 'Laptop';
Теперь запросите весь JSON-объект, чтобы увидеть недавно добавленное поле.
SELECT product_details FROM products WHERE product_name = 'Laptop';
Вывод покажет документ product_details, который теперь включает свойство color.
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| product_details |
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| {"brand": "Dell", "color": "Silver", "model": "XPS 13", "price": 1250, "specs": {"memory": "16GB", "storage": "512GB SSD", "processor": "Intel Core i7"}} |
+-----------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Вы успешно изменили и расширили JSON-документ в таблице.
Создание индекса по свойству JSON
Для больших таблиц запросы к полям JSON могут быть медленными. Для повышения производительности вы можете создать индекс по значению, извлеченному из столбца JSON. В MariaDB это достигается путем добавления виртуального столбца на основе поля JSON, а затем создания индекса на этом виртуальном столбце.
На этом этапе вы создадите виртуальный столбец для свойства price и затем проиндексируете его для ускорения запросов, основанных на цене.
Сначала добавьте виртуальный столбец, который извлекает цену из данных JSON:
ALTER TABLE products ADD COLUMN price_virtual INT AS (CAST(JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.price')) AS SIGNED)) STORED;
Эта команда добавляет виртуальный столбец с именем price_virtual, который автоматически вычисляет и сохраняет значение цены из данных JSON.
Теперь создайте индекс на этом виртуальном столбце:
CREATE INDEX idx_product_price ON products (price_virtual);
Этот подход позволяет MariaDB эффективно искать строки по числовой цене, используя индексированный виртуальный столбец.
Чтобы подтвердить создание индекса, используйте команду SHOW INDEXES.
SHOW INDEXES FROM products;
Вывод перечислит все индексы в таблице products, включая ваш новый idx_product_price.
+----------+------------+-------------------+...
| Table | Non_unique | Key_name |...
+----------+------------+-------------------+...
| products | 0 | PRIMARY |...
| products | 1 | idx_product_price |...
+----------+------------+-------------------+...
Самое важное — увидеть, использует ли оптимизатор индекс. Вы можете проверить это с помощью команды EXPLAIN.
EXPLAIN SELECT product_name FROM products WHERE price_virtual > 1200;
В выводе EXPLAIN посмотрите на столбцы possible_keys и key. Вы должны увидеть там idx_product_price, что подтверждает, что MariaDB использует ваш индекс для эффективного выполнения запроса.
Вы также можете выполнять запросы, используя исходное выражение JSON, и оптимизатор MariaDB все равно сможет использовать индекс на виртуальном столбце:
EXPLAIN SELECT product_name FROM products WHERE CAST(JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.price')) AS SIGNED) > 1200;
Вы успешно создали виртуальный столбец и проиндексировали его для оптимизации запросов к свойствам JSON.
Теперь вы можете выйти из оболочки MySQL.
exit
Резюме
В этой лабораторной работе вы получили практический опыт работы с данными JSON в MariaDB. Вы изучили полный рабочий процесс, от настройки структуры базы данных до выполнения расширенных операций.
Вы успешно вставили структурированные данные JSON, запрашивали конкретные поля с помощью JSON_EXTRACT и JSON_UNQUOTE, а также фильтровали записи на основе значений внутри документа JSON. Вы также практиковались в изменении этих данных с помощью JSON_SET для обновления и добавления новых свойств. Наконец, вы изучили ключевой метод оптимизации, создав виртуальный столбец для свойства JSON и проиндексировав его для улучшения производительности запросов.
Эти навыки ценны для проектирования гибких схем баз данных и эффективного управления полуструктурированными данными в MariaDB.



