Исследуем структуру базы данных MySQL с помощью функций SHOW
Любая база данных это сложный набор всевозможных компонентов: таблиц, индексов, представлений, функций, процедур и других элементов. Для эффективной работы, и разработчику и тестировщику работающим с чужой базой данных важно иметь возможность исследовать все необходимые компоненты.
В базе данных MySQL для этой цели существует целое семейство функций SHOW.
Давайте ознакомимся с некоторыми из них и поймем, как они могут помочь QA специалистам и программистам.
1. SHOW DATABASES - "Покажи мне все свои хранилища"
Первым делом, когда вы открываете MySQL, вы можете воспользоваться SHOW DATABASES
, чтобы увидеть все доступные базы данных. Это как список папок на компьютере. Пример ниже (и все следующие) с сайта sqlize.online
mysql> SHOW DATABASES; |--------------------| | Database | |--------------------| | information_schema | | sakila |
Как вы видите эта команда выводит список всех доступных вам баз данных. Если у вашего пользователя нет доступа к какой-то из баз то вы не увидите её в списке. Это нужно учесть при вашем исследовании.
2. SHOW TABLES - "Покажи, что у тебя есть"
Когда вы хотите узнать, какие таблицы существуют в определенной базе данных, просто используйте SHOW TABLES
. Это похоже на просмотр содержимого папки на компьютере. Для того что бы получить список таблиц в нужной нам базе перед выполнением команды SHOW
нужно выполнить USE dbname;
mysql> USE sakila; -- в данном случае мы будем исследовать базу данных sakila mysql> SHOW TABLES; |----------------------------| | Tables_in_sakila | |----------------------------| | actor | | actor_info | | address | | category | | city | | country | | customer | | customer_list | | film | | film_actor | | film_category | | film_list | | film_text | | inventory | | language | | nicer_but_slower_film_list | | payment | | rental | | sales_by_film_category | | sales_by_store | | staff | | staff_list | | store |
Таким образом мы получили список таблиц.
3. SHOW COLUMNS - "Что у тебя внутри?"
Если вам интересно, какие столбцы есть в таблице, просто воспользуйтесь SHOW COLUMNS
. Так вы узнаете, какие данные вы можете там найти. Данная команда используется вместе с названием исследуемой таблицы следующим образом:
mysql> SHOW COLUMNS FROM city; |-------------|------------------|------|-----|-------------------|-----------------------------| | Field | Type | Null | Key | Default | Extra | |-------------|------------------|------|-----|-------------------|-----------------------------| | city_id | int(10) unsigned | NO | PRI | [null] | auto_increment | | city | varchar(50) | NO | | [null] | | | country_id | int(10) unsigned | NO | MUL | [null] | | | last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
Данная команда возвращает более подробный результат. Вы видите не только наименования колонок но и их тип, возможность сохранения пустых значений (NULL) является ли поле ключевым, его значение по умолчанию и дополнительную информацию о колонке.
Данное исследование может дать нам ответ на вопрос: Почему я не могу добавить запись не указав название, или почему в поле last_update
появилось значение которое я не указывал.
4. SHOW INDEX - "Покажи мне твои секретные индексы"
С SHOW INDEX
вы можете посмотреть, какие индексы установлены в таблице. Это поможет вам понять, какие столбцы можно использовать для быстрого доступа к данным.
mysql> SHOW INDEX FROM city; |-------|------------|-------------------|--------------|-------------|-----------|-------------|----------|--------|------|------------|---------|---------------| | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | |-------|------------|-------------------|--------------|-------------|-----------|-------------|----------|--------|------|------------|---------|---------------| | city | 0 | PRIMARY | 1 | city_id | A | 600 | [null] | [null] | | BTREE | | | | city | 1 | idx_fk_country_id | 1 | country_id | A | 109 | [null] | [null] | | BTREE | | |
Здесь мы видим что таблица имеет первичный ключ по полю city_id
а также не уникальный индекс по полю country_id
. Этой информации нам будет достаточно чтобы понять что выборка из таблицы городов по идентификатору страны должна быть очень быстрой.
5. SHOW CREATE TABLE - "Покажи, как создать это"
Хотите узнать, как создать определенную таблицу? Просто используйте SHOW CREATE TABLE
, и MySQL покажет вам SQL-запрос для создания таблицы.
mysql> SHOW CREATE TABLE city; CREATE TABLE `city` ( `city_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `city` varchar(50) NOT NULL, `country_id` int(10) unsigned NOT NULL, `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`city_id`), KEY `idx_fk_country_id` (`country_id`), CONSTRAINT `fk_city_country` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=601 DEFAULT CHARSET=utf8
Очень удобная штука! Таким образом вы видите всю структуру в компактном виде. Это удобно для сравнения структуры таблиц например на тестовом сервере и на боевом. Так же эта команда не заменив если кто-то просит вас показать DDL таблиц. Одна команда и всё готово. Кстати если вам нужно поделиться с коллегой вы можете воспользоваться сайтом sqlize.online - наберите или скопируйте свой SQL код, нажмите кнопку RUN чтобы код был выполнен системой, а затем кнопку SHARE чтобы получить в буфер обмена короткую ссылку на ваш код. Посе этого людой кто получит ссылку сможет продолжить работать с вашим кодом!
В дополнение к SHOW CREATE TABLE вы можете использовать SHOW CREATE DATABASE / EVENT/FUNCTION / PROCEDURE / TRIGGER / USER / VIEW
то есть получить код создания любого объекта в базе данных
6. SHOW TABLE STATUS - "Сколько у тебя строк?"
Наконец, SHOW TABLE STATUS
позволяет вам получить различную информацию о таблице, такую как количество строк или размер таблицы. Это полезно для оценки производительности и размера таблиц.
mysql> SHOW TABLE STATUS LIKE 'city'; |------|--------|---------|------------|------|----------------|-------------|-----------------|--------------|-----------|----------------|---------------------|-------------|------------|--------------------|----------|----------------|---------| | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | |------|--------|---------|------------|------|----------------|-------------|-----------------|--------------|-----------|----------------|---------------------|-------------|------------|--------------------|----------|----------------|---------| | city | InnoDB | 10 | Dynamic | 600 | 109 | 65536 | 0 | 16384 | 0 | 601 | 2024-03-15 09:57:44 | [null] | [null] | utf8mb3_general_ci | [null] | | |
Из полученной таблицы мы можем извлечь массу полезной информации: когда была создана таблица, когда была изменена, сколько в ней строк и каково значение автоинкремента о котором я писал здесь. В общем ещё один ценный инструмент в руках исследователя!
7. SHOW GRANTS - "Кто имеет доступ?"
С помощью SHOW GRANTS
можно узнать привилегии, предоставленные пользователям в MySQL. Это полезно для проверки безопасности и доступа к данным.
mysql> SHOW GRANTS FOR 'user'@'host';
Если у вас достаточно привилегий в базе то при помощи этой команды можно узнать кто ещё может подключаться к базе и какие действия выполнять. Это очень полезная команда для сисадминов и пен-тестеров.
8. SHOW MASTER / REPLICA STATUS - "Эй! Кто отстаёт?"
Эта команда необходима в случае репликации для того чтобы понять всё ли с ней в порядке и если нет - насколько всё плохо.
8. SHOW [GLOBAL] VARIABLES - "Покажи настройки"
Данная команда позволяет увидеть параметры конфигурации базы данных. Если вам нужно выбрать только нужные из большого списка - отфильтруйте их при помощи LIKE как в примере ниже:
mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool%'; |-------------------------------------|----------------| | Variable_name | Value | |-------------------------------------|----------------| | innodb_buffer_pool_chunk_size | 134217728 | | innodb_buffer_pool_dump_at_shutdown | ON | | innodb_buffer_pool_dump_now | OFF | | innodb_buffer_pool_dump_pct | 25 | | innodb_buffer_pool_filename | ib_buffer_pool | | innodb_buffer_pool_in_core_file | ON | | innodb_buffer_pool_instances | 1 | | innodb_buffer_pool_load_abort | OFF | | innodb_buffer_pool_load_at_startup | ON | | innodb_buffer_pool_load_now | OFF | | innodb_buffer_pool_size | 134217728 |
Эти значения могут помочь вам в оптимизации работы сервера.
Далее без лишних подробностей перечислю ещё несколько полезных команд которыми мне приходилось пользоваться:
- SHOW ERRORS - показывает список ошибок.
- SHOW ENGINE STATUS - статус движка базы данных - позволяет увидеть DEAD LOCKS
Таким образом я привел список наиболее употребимых команд из целого класса SHOW SATEMENTS которые могут сильно облегчить понимание устройства базы данных разработчиками и тестировщиками. Не стесняйтесь заглядывать в этот раздел команд если вам нужно вытащить какую либо информацию о имеющейся у вас базе.