在隐藏function的悠久传统中,让我们列出MySQL中的隐藏function。
每个答案都做一个function。
另见:
Linux的隐藏特性
PowerShell的隐藏function
Oracle数据库的隐藏function
Windows 2008的隐藏function
Solaris / OpenSolaris的隐藏function
SQL Server的隐藏function
IIS的隐藏function(6.0 / 7.0)
一个通常没有使用,但更详细
显示完整的进程列表
是方便的,但不如真棒非企业查询分析器 – 启用像这样
mysql> set profiling = 1;
查询OK,0行受影响(0.00秒)
这两个是垃圾查询来填充configuration文件表,
mysql> select * from _test.customers;
错误1146(42S02):表'_test.customers'不存在
mysql> select * from test.customers limit 0;
空集(0.00秒)
获取所有已查询的查询及其持续时间的列表
mysql> show profiles;
+ ---------- + ------------ + ------------------------- ------ +
| Query_ID | 持续时间| 查询|
+ ---------- + ------------ + ------------------------- ------ +
| 1 | 0.00013400 | 从_test.customersselect*
| 2 | 0.01546500 | 从test.customers中select*
+ ---------- + ------------ + ------------------------- ------ +
最后一个查询的显示信息只是“show profile” – 或者你可以指定一个查询
mysql>显示查询2的configuration文件;
+ ---------------------- + ---------- +
| 状态| 持续时间|
+ ---------------------- + ---------- +
| 开始| 0.000053 |
| 检查权限| 0.000007 |
| 打开表格 0.000014 |
| 系统locking| 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等( 均在手册页中 )
mysql> show profile cpu for query 2;
+ ---------------------- + ---------- + ---------- + ---- -------- +
| 状态| 持续时间| CPU_user | CPU_system |
+ ---------------------- + ---------- + ---------- + ---- -------- +
| 开始| 0.000056 | 0.001000 | 0.000000 |
| 检查权限| 0.000007 | 0.000000 | 0.000000 |
| 打开表格 0.000010 | 0.000000 | 0.000000 |
| 系统locking| 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;
查询OK,0行受影响(0.00秒)
一些并不总是公知或记住的MySQL命令 。
将结果集的方向更改为垂直,便于阅读和粘贴。
mysql> SELECT CURDATE(), CURTIME()\G *************************** 1. row *************************** CURDATE(): 2009-06-26 CURTIME(): 12:10:37
取消当前正在input的查询,同时将其留在历史logging中。
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]>
search你的命令历史给定的string(如Bash)。
开始inputsearch词并重复^ R来循环查看结果。
^R (reverse-i-search)`DATE': SELECT CURDATE(), CURTIME();
我学到的技巧可能对某些人有用:
要运行您之前保存的文件:
source filename # Alternatively you can enter "\\. filename".
使用 ”\!” 访问shell命令。 例如:
\\! ls c*sql # To list all your SQL files in directory starting with "c".
所以,如果你想写你的语句到一个文件(不使用编辑器选项),你可以input:
\\! echo 'select * from emp where job ="salesman" ' > test2.sql # Editor option seems easier to me though!
如果你input
\\T filename
你将会把你的语句和查询结果定向/打印到你指定的文件名中。 使用\\tclosures此function。
用\\G代替“;”来终止查询 以便以行格式显示输出而不是以列显示。
不要排除在SHOW语句中使用Where … LIKE子句。 例如:
SHOW STATUS LIKE '%cache%';
最后,在不查看my.cnf文件的情况下查找MySQL数据目录的位置:
SHOW VARIABLES LIKE 'datadir';
我个人喜欢SHOW命令
你可以做
SHOW PROCESSLIST – 查看所有正在运行的连接到mysql
SHOW CREATE TABLE TableName – 查看用于创build表的sql
SHOW CREATE PROCEDURE ProcedureName – 查看用于创buildSP的sql
SHOW VARIABLES – 查看所有系统variables
在这里获取完整列表
实际logging ,但非常烦人:不正确的数据自动date转换。
在MySQL 5.0.2之前,MySQL会宽恕非法或不正确的数据值,并将其强制为合法的数据input值。 在MySQL 5.0.2及更高版本中,这仍然是默认行为,但您可以更改服务器SQL模式以select更为传统的错误值处理方式,以便服务器拒绝它们并中止它们出现的语句。
有时,如果MySQL没有将input调整到附近的有效date,而是将其存储为按照定义无效的“ 0000-00-00 ”,那么您将会“幸运”。 然而,即使这样,你可能已经想要MySQL失败,而不是为你默默存储这个值。
另一个使MySQL与其他数据库不同的特性是REPLACE INTO命令。 你可以做:
REPLACE INTO T1 (Col1, Col2 ) SELECT Col1, Col2 FROM T2;
您也可以像编写update语句一样编写replace语句:
REPLACE INTO T1 SET Col1 = 'SomeValue1' , Col2 = 'SomeValue2'
不是一个真正的隐藏function,但它是鲜为人知的,我使用它很多,以保存做一个查询来检查是否存在之前做一个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
那么,不能标记这是一个重复,因为它是一个不同的网站(我没有在这里代表),但我只是链接到这个优秀的stackoverflowpost相同的问题 :
除了pQD的答案(作为noobie,我还不能添加注释),如果你还没有添加到正确的my.cnf文件的慢查询日志的path,错误日志将是写入数据目录(使用SHOW VARIABLES LIKE'datadir';找出它的位置),文件名格式为[systemname] -slow.log