Скрытые возможности MySQL
В давней традиции использования скрытых функций, давайте представим список скрытых функций в MySQL.
Сделайте одну функцию за ответ.
Также см:
Скрытые возможности Linux
Скрытые возможности PowerShell
Скрытые возможности Oracle Database
Скрытые возможности Windows 2008
Скрытые возможности Solaris/OpenSolaris
Скрытые возможности SQL Server
Скрытые возможности IIS (6.0 / 7.0)
11 ответов
Часто неиспользуемый, но более многословный
удобен, но не так хорош, как потрясающий анализатор запросов не-предприятия - включите так
mysql> set profiling=1; Запрос в порядке, затронуто 0 строк (0,00 с)
Это два ненужных запроса для заполнения таблицы профилей,
mysql> select * from _test.customers; ОШИБКА 1146 (42S02): Таблица "_test.customers" не существует mysql> select * from test.customers limit 0; Пустой набор (0,00 с)
Получить список всех профилированных запросов и их продолжительность
mysql> показывать профили; +----------+------------+-------------------------------+ | Query_ID | Продолжительность | Запрос | +----------+------------+-------------------------------+ | 1 | 0,00013400 | выберите * из _test.customers | | 2 | 0,01546500 | выберите * из test.customers | + ---------- + ------------ + ------------------------- ------ +
Отображаемая информация для последнего запроса будет просто "показывать профиль" - или вы можете указать запрос
mysql> показать профиль для запроса 2; +----------------------+----------+ | Статус | Продолжительность | + ---------------------- + ---------- + | начиная | 0,000053 | | проверка разрешений | 0,000007 | | Открывающиеся столы | 0,000014 | | Системная блокировка | 0,000006 | | Блокировка стола | 0,000008 | | init | 0,000065 | | оптимизация | 0,000003 | | выполнение | 0.000201 | | конец | 0,000003 | | конец запроса | 0,000002 | | освобождение предметов | 0,000020 | | ведение журнала медленного запроса | 0,000002 | | уборка | 0,000004 | +----------------------+----------+ 13 рядов в наборе (0,00 сек)
Вы также можете запросить определенную информацию, такую как CPU, BLOCK IO и SWAPS среди других ( все на странице man)
mysql> показать профиль процессора для запроса 2; +----------------------+----------+----------+------------+ | Статус | Продолжительность | CPU_user | CPU_system | +----------------------+----------+----------+------------+ | начиная | 0,000056 | 0,001000 | 0,000000 | | проверка разрешений | 0,000007 | 0,000000 | 0,000000 | | Открывающиеся столы | 0,000010 | 0,000000 | 0,000000 | | Системная блокировка | 0,000005 | 0,000000 | 0,000000 | | Блокировка стола | 0,000007 | 0,000000 | 0,000000 | | init | 0,000059 | 0,000000 | 0,000000 | | оптимизация | 0,000003 | 0,000000 | 0,000000 | | статистика | 0,015022 | 0,000000 | 0,000000 | | готовит | 0,000014 | 0,001000 | 0,000000 | | выполнение | 0,000004 | 0,000000 | 0,000000 | | Отправка данных | 0.000245 | 0,000000 | 0,000000 | | конец | 0,000004 | 0,000000 | 0,000000 | | конец запроса | 0,000002 | 0,000000 | 0,000000 | | освобождение предметов | 0,000021 | 0,000000 | 0,000000 | | ведение журнала медленного запроса | 0,000002 | 0,000000 | 0,000000 | | уборка | 0,000004 | 0,000000 | 0,000000 | +----------------------+----------+----------+------------+ 16 рядов в наборе (0,00 сек)
Не забудьте отключить его позже, так как регистрация добавляет накладные расходы.
mysql> set profiling = 0; Запрос в порядке, затронуто 0 строк (0,00 с)
Некоторые команды MySQL, которые не всегда широко известны или запоминаются.
Измените ориентацию набора результатов на вертикальную для удобства чтения и вставки.
mysql> SELECT CURDATE(), CURTIME()\G
*************************** 1. row ***************************
CURDATE(): 2009-06-26
CURTIME(): 12:10:37
Отмените запрос, который вы вводите в данный момент, оставив его в своей истории.
mysql> SELECT CURDATE(), CURTIME()\c
mysql>
Отредактируйте запрос или последний запрос (соответственно) с вашим любимым $EDITOR.
mysql> SELECT CURDATE(), CURTIME()\e
mysql> \e
Очистите вывод консоли.
mysql> \! clear
Сравните наборы результатов по хешу MD5.
mysql> pager md5sum -
PAGER set to 'md5sum -'
mysql> SELECT CURDATE(), CURTIME();
d24e22e4e2d33dfda9f01ba934b7676a -
mysql> nopager
PAGER set to stdout
Измените ваше приглашение.
mysql> prompt (\u@\h) [\d]>\_
PROMPT set to '(\u@\h) [\d]>\_'
(dan@localhost) [test]>
Найдите в своей истории команд заданную строку (например, Bash).
Начните вводить критерий поиска и повторите ^R, чтобы просмотреть результаты.
^R
(reverse-i-search)`DATE': SELECT CURDATE(), CURTIME();
Уловки, которые я узнал, могут быть полезны для некоторых:
Чтобы запустить ранее сохраненный файл:
source filename # Alternatively you can enter "\\. filename".
Используйте "\!" для доступа к командам оболочки. Например:
\\! ls c*sql # To list all your SQL files in directory starting with "c".
Поэтому, если вы хотите записать свое заявление в файл (без использования опции редактора), вы можете ввести:
\\! echo 'select * from emp where job ="salesman" ' > test2.sql # Editor option seems easier to me though!
Если вы введете
\\T filename
После этого ваши утверждения и результаты запроса будут направлены / распечатаны в указанный вами файловый файл. использование \\t
чтобы выключить это.
Завершить запрос с помощью \\G
вместо ";" чтобы показать вывод в формате строки, а не в столбцах.
Не исключайте использование предложения Where...LIKE с оператором SHOW. Например:
SHOW STATUS LIKE '%cache%';
Наконец, чтобы найти местоположение вашего каталога данных MySQL, не глядя на my.cnf
использование файла:
SHOW VARIABLES LIKE 'datadir';
Фактически задокументировано, но очень раздражает: автоматическое преобразование даты для некорректных данных.
До MySQL 5.0.2 MySQL прощает недопустимые или неправильные значения данных и приводит их к допустимым значениям для ввода данных. В MySQL 5.0.2 и более поздних версиях это остается поведением по умолчанию, но вы можете изменить режим SQL сервера, чтобы выбрать более традиционную обработку неверных значений, чтобы сервер отклонял их и прерывал оператор, в котором они встречаются.
Иногда вам "везет", когда MySQL не корректирует ввод для близких действительных дат, а вместо этого сохраняет его как 0000-00-00
который по определению недействителен. Однако даже тогда вы могли захотеть, чтобы MySQL потерпел неудачу, а не хранить это значение в молчании.
Еще одной особенностью, которая отличает MySQL от других баз данных, является REPLACE INTO
команда. Ты можешь сделать:
REPLACE INTO T1 (Col1, Col2 )
SELECT Col1, Col2 FROM T2;
Вы также можете написать оператор замены так же, как вы пишете оператор обновления:
REPLACE INTO T1
SET Col1 = 'SomeValue1'
, Col2 = 'SomeValue2'
Мне лично нравится SHOW
команда
Вы могли бы сделать SHOW PROCESSLIST
- Чтобы увидеть все работающие подключения к MySQL SHOW CREATE TABLE TableName
- Чтобы увидеть sql используется для создания таблицы SHOW CREATE PROCEDURE ProcedureName
- Чтобы увидеть sql используется для создания SP SHOW VARIABLES
- Чтобы увидеть все системные переменные
Получить полный список здесь
Не совсем скрытая функция, но она менее известна, и я часто ее использую, чтобы сэкономить выполнение запроса, чтобы проверить, существует ли что-то перед выполнением UPDATE или INSERT
INSERT ... ON DUPLICATE KEY UPDATE
Документация здесь
Не очень скрытый, но медленный журнал запросов может быть очень полезен для отслеживания причин проблем с производительностью в часы пик.
В файле my.cnf
, раздел [mysqld] - добавить:
log_slow_queries=/var/log/mysql/mysql-slow.log
# log queries that took more than 1 sec
long_query_time = 1
Чтобы увидеть план выполнения запроса, используйте EXPLAIN
например
EXPLAIN
SELECT T1.Col1, T2.Col2
FROM T1 INNER JOIN T2 ON T1.Id = T2.Id
WHERE T1.Col3 = 10
Так же, как дополнение к ответу pQD (как новичок, я пока не могу добавить комментарий), если вы еще не добавили путь к журналу медленных запросов в правильном файле my.cnf, журнал ошибок будет записывается в каталог данных (используйте SHOW VARIABLES LIKE 'datadir'; чтобы узнать, где это), и имя файла будет в формате [systemname]-slow.log
Ну, не могу пометить это как дубликат, так как это другой сайт (и у меня здесь нет представителя), но я просто сошлюсь на этот отличный пост stackoverflow по тому же вопросу: