MySQL的隐藏function

在隐藏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