Скрытые возможности MySQL

15

В давней традиции наличия скрытых функций, давайте представим список скрытых функций в MySQL.

Поставьте одну функцию в ответ.

См. Также:
Скрытые возможности Linux.
Скрытые функции PowerShell.
Скрытые функции базы данных Oracle.
Скрытые функции Windows 2008.
Скрытые функции Solaris / OpenSolaris.
Скрытые функции SQL Server.
Скрытые функции IIS (6.0 / 7.0).

Binoj Antony
источник

Ответы:

9

Часто неиспользуемый, но более многословный

ПОКАЗАТЬ ПОЛНЫЙ ПРОЦЕССЛИСТ

удобен, но не так хорош, как потрясающий анализатор запросов не-предприятия - включите так

    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 с)
Энди
источник
Вы также можете использовать SHOW PROFILE ALL FOR QUERY X, чтобы показать все данные профилирования.
Кедаре
8

Некоторые команды 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();
Дэн Карли
источник
+1 на md5sum. Мне нравится md5sum -идея использовать в качестве пейджера. Не совсем mysql специфический ты
serverhorror
4

Уловки, которые я узнал, могут быть полезны для некоторых:

Чтобы запустить ранее сохраненный файл:

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';
DBMarcos99
источник
3

Мне лично нравится SHOWкоманда

Вы можете сделать
SHOW PROCESSLIST- Чтобы увидеть все работающие соединения с MySQL
SHOW CREATE TABLE TableName- Чтобы увидеть SQL используется для создания таблицы
SHOW CREATE PROCEDURE ProcedureName- Чтобы увидеть SQL используется для создания SP
SHOW VARIABLES- Чтобы увидеть все системные переменные

Получить полный список здесь

Биной ​​Антоний
источник
1
Я немного озадачен тем, что вы перечислили хорошо известные и задокументированные команды, такие как SHOW и EXPLAIN, в качестве «скрытых функций». Разве скрытая особенность не документирована?
Джон Гарденье
Ну, намерение состоит в том, чтобы вывести не очень известные полезные команды, что может быть хорошо известно одному, может быть неизвестно кому-то еще, что скажете?
Биной ​​Энтони
3

Фактически задокументировано , но очень раздражает: автоматическое преобразование даты для неверных данных.

До MySQL 5.0.2 MySQL прощал недопустимые или неправильные значения данных и приводил их к допустимым значениям для ввода данных. В MySQL 5.0.2 и выше это остается поведением по умолчанию, но вы можете изменить режим SQL сервера, чтобы выбрать более традиционную обработку некорректных значений, чтобы сервер отклонял их и прерывал оператор, в котором они встречаются.

Иногда вам «везет», когда MySQL не корректирует ввод для близких действительных дат, а вместо этого сохраняет его как 0000-00-00недопустимый по определению. Однако даже тогда вы могли захотеть, чтобы MySQL потерпел неудачу, а не хранить это значение в молчании.

Арьян
источник
3

Еще одна особенность, которая отличает MySQL от других баз данных, - это REPLACE INTOкоманда. Ты можешь сделать:

REPLACE INTO T1 (Col1, Col2 )
SELECT Col1, Col2 FROM T2;

Вы также можете написать оператор замены так же, как вы пишете оператор обновления:

REPLACE INTO T1 
SET Col1 = 'SomeValue1'
, Col2   = 'SomeValue2'
Binoj Antony
источник
1
REPLACE INTO полезен, но следует отметить, что он выполняет проверку ключа, УДАЛЯЕТ, если соответствующий ключ найден, и, наконец, INSERT, что занимает намного больше времени, чем INSERT ... ON DUPLICATE KEY UPDATE
Энди
2

Не совсем скрытая функция, но она менее известна, и я часто ее использую, чтобы сэкономить выполнение запроса, чтобы проверить, существует ли что-то перед выполнением UPDATE или INSERT

INSERT ... ON DUPLICATE KEY UPDATE

Документация здесь

Пол Диксон
источник
1

Чтобы увидеть план выполнения запроса, используйте EXPLAIN

например

EXPLAIN 
SELECT T1.Col1, T2.Col2
FROM T1 INNER JOIN T2 ON T1.Id = T2.Id
WHERE T1.Col3 = 10
Биной ​​Антоний
источник
1

Не очень скрытый, но медленный журнал запросов может быть очень полезен для отслеживания причин проблем с производительностью в часы пик.

В файле my.cnf, раздел [mysqld] - добавьте:

log_slow_queries=/var/log/mysql/mysql-slow.log
# log queries that took more than 1 sec
long_query_time = 1
pQd
источник
0

Так же, как дополнение к ответу pQD (как новичок, я пока не могу добавить комментарий), если вы еще не добавили путь к журналу медленных запросов в правильном файле my.cnf, журнал ошибок будет записывается в каталог данных (используйте SHOW VARIABLES LIKE 'datadir'; чтобы выяснить, где это), и имя файла будет в формате [systemname] -slow.log

DBMarcos99
источник