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