Скрытые возможности 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 по тому же вопросу:

Другие вопросы по тегам