Следуя давней традиции наличия скрытых функций, давайте составим список скрытых функций в MySQL.
Ставьте одну особенность в ответ.
Также см:
Скрытые возможности Linux
Скрытые возможности PowerShell
Скрытые возможности Oracle Database
Скрытые возможности Windows 2008
Скрытые возможности Solaris / OpenSolaris
Скрытые возможности SQL Server
Скрытые возможности IIS (6.0 / 7.0)
Часто неиспользуемый, но более подробный
удобно, но не так хорошо, как круто не корпоративный анализатор запросов - включить вот так
mysql> set profiling=1; Query OK, 0 rows affected (0.00 sec)
Это два нежелательных запроса для заполнения таблицы профилей,
mysql> select * from _test.customers; ERROR 1146 (42S02): Table '_test.customers' doesn't exist mysql> select * from test.customers limit 0; Empty set (0.00 sec)
Получите список всех профилированных запросов и их продолжительности
mysql> show profiles; +----------+------------+-------------------------------+ | Query_ID | Duration | Query | +----------+------------+-------------------------------+ | 1 | 0.00013400 | select * from _test.customers | | 2 | 0.01546500 | select * from test.customers | +----------+------------+-------------------------------+
Информация для отображения для последнего запроса будет просто "показать профиль" - или вы можете указать запрос
mysql> show profile for query 2; +----------------------+----------+ | Status | Duration | +----------------------+----------+ | starting | 0.000053 | | checking permissions | 0.000007 | | Opening tables | 0.000014 | | System lock | 0.000006 | | Table lock | 0.000008 | | init | 0.000065 | | optimizing | 0.000003 | | executing | 0.000201 | | end | 0.000003 | | query end | 0.000002 | | freeing items | 0.000020 | | logging slow query | 0.000002 | | cleaning up | 0.000004 | +----------------------+----------+ 13 rows in set (0.00 sec)
Вы также можете запросить конкретную информацию, такую как CPU, BLOCK IO и SWAPS среди других (все на странице руководства)
mysql> show profile cpu for query 2; +----------------------+----------+----------+------------+ | Status | Duration | CPU_user | CPU_system | +----------------------+----------+----------+------------+ | starting | 0.000056 | 0.001000 | 0.000000 | | checking permissions | 0.000007 | 0.000000 | 0.000000 | | Opening tables | 0.000010 | 0.000000 | 0.000000 | | System lock | 0.000005 | 0.000000 | 0.000000 | | Table lock | 0.000007 | 0.000000 | 0.000000 | | init | 0.000059 | 0.000000 | 0.000000 | | optimizing | 0.000003 | 0.000000 | 0.000000 | | statistics | 0.015022 | 0.000000 | 0.000000 | | preparing | 0.000014 | 0.001000 | 0.000000 | | executing | 0.000004 | 0.000000 | 0.000000 | | Sending data | 0.000245 | 0.000000 | 0.000000 | | end | 0.000004 | 0.000000 | 0.000000 | | query end | 0.000002 | 0.000000 | 0.000000 | | freeing items | 0.000021 | 0.000000 | 0.000000 | | logging slow query | 0.000002 | 0.000000 | 0.000000 | | cleaning up | 0.000004 | 0.000000 | 0.000000 | +----------------------+----------+----------+------------+ 16 rows in set (0.00 sec)
Не забудьте потом отключить его, так как ведение журнала увеличивает накладные расходы.
mysql> set profiling=0; Query OK, 0 rows affected (0.00 sec)
Некоторые Команды 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';
Мне лично нравится SHOW
команда
Ты мог бы сделать
SHOW PROCESSLIST
- Чтобы увидеть все запущенные подключения к mysql
SHOW CREATE TABLE TableName
- Чтобы увидеть sql, используемый для создания таблицы
SHOW CREATE PROCEDURE ProcedureName
- Чтобы увидеть sql, используемый для создания SP
SHOW VARIABLES
- Чтобы увидеть все системные переменные
Получите полный список Вот
Фактически задокументированный, но очень раздражает: автоматическое преобразование даты для неверных данных.
До 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'
Не совсем скрытая функция, но она менее известна, и я часто использую ее, чтобы сэкономить, выполняя запрос, чтобы проверить, существует ли что-то перед выполнением UPDATE или INSERT
INSERT ... ON DUPLICATE KEY UPDATE
Документация есть Вот
Чтобы увидеть план выполнения запроса, используйте EXPLAIN
например
EXPLAIN
SELECT T1.Col1, T2.Col2
FROM T1 INNER JOIN T2 ON T1.Id = T2.Id
WHERE T1.Col3 = 10
Не совсем скрыто, но журнал медленных запросов может быть действительно полезным для отслеживания причин проблем с производительностью в часы пик.
В файле my.cnf
, раздел [mysqld] - добавить:
log_slow_queries=/var/log/mysql/mysql-slow.log
# log queries that took more than 1 sec
long_query_time = 1
Ну, не могу пометить это как дубликат, так как это другой сайт (и у меня нет здесь представителя), но я просто сделаю ссылку на это отличный пост stackoverflow по тому же вопросу:
Как дополнение к ответу pQD (как новичок, я еще не могу добавить комментарий), если вы еще не добавили путь к журналу медленных запросов в правильный файл my.cnf, журнал ошибок будет записывается в каталог данных (используйте SHOW VARIABLES LIKE 'datadir'; чтобы узнать, где это находится), а имя файла будет в формате [systemname] -slow.log