MySQL的隐藏特性

MySQL的隐藏特性,mysql,database,hidden-features,Mysql,Database,Hidden Features,我已经工作多年了,但最近才开始使用我的web应用程序,我渴望知识 为了继续我的长篇大论,我想知道MySQL的任何隐藏的或方便的特性,这将有助于提高我对这个开源数据库的了解。MySQL的一个不太隐藏的特性是,它不太擅长与SQL兼容,嗯,不是真正的bug,但是,更多…:-) 找出谁在做什么的命令: mysql> show processlist; show processlist; +----+-------------+-----------------+------+---------+-

我已经工作多年了,但最近才开始使用我的web应用程序,我渴望知识


为了继续我的长篇大论,我想知道MySQL的任何隐藏的或方便的特性,这将有助于提高我对这个开源数据库的了解。

MySQL的一个不太隐藏的特性是,它不太擅长与SQL兼容,嗯,不是真正的bug,但是,更多…:-)

找出谁在做什么的命令:

mysql> show processlist;
show processlist;
+----+-------------+-----------------+------+---------+------+----------------------------------+------------------+
| Id | User        | Host            | db   | Command | Time | State                            | Info             |
+----+-------------+-----------------+------+---------+------+----------------------------------+------------------+
|  1 | root        | localhost:32893 | NULL | Sleep   |    0 |                                  | NULL             |
|  5 | system user |                 | NULL | Connect |   98 | Waiting for master to send event | NULL             |
|  6 | system user |                 | NULL | Connect | 5018 | Reading event from the relay log | NULL             |
+-----+------+-----------+---------+---------+-------+-------+------------------+
3 rows in set (0.00 sec) 
您可以通过以下方式终止进程:

mysql>kill 5 

查找缓存中当前有哪些表的命令:

mysql> SHOW open TABLES FROM test;
+----------+-------+--------+-------------+
| DATABASE | TABLE | In_use | Name_locked |
+----------+-------+--------+-------------+
| test     | a     |      3 |           0 |
+----------+-------+--------+-------------+
1 row IN SET (0.00 sec)

(From)

我特别喜欢MySQL对
inet\u ntoa()
inet\u aton()
的内置支持。它使表中IP地址的处理变得非常简单(至少只要它们只是IPv4地址!)

您可能会发现一些有趣的事情:

<query>\G -- \G in the CLI instead of the ; will show one column per row
explain <query>; -- this will show the execution plan for the query
\G--\G在CLI中,而不是;将显示每行一列
解释;——这将显示查询的执行计划

既然你悬赏了,我就分享我来之不易的秘密

通常,我今天调优的所有SQL都需要使用子查询。由于来自Oracle数据库世界,我认为理所当然的事情与MySQL不一样。我对MySQL调优的阅读使我得出结论,MySQL在优化查询方面落后于Oracle

虽然大多数B2C应用程序所需的简单查询可能适用于MySQL,但智能报告所需的大多数聚合报告类型的查询似乎需要对SQL查询进行合理的规划和重新组织,以指导MySQL更快地执行它们

管理:
max\u connections
是并发连接数。默认值为100个连接(从5.0开始为151个)-非常小

注:

连接占用内存,您的操作系统可能无法处理大量连接

Linux/x86的MySQL二进制文件允许最多4096个并发连接,但自编译二进制文件的限制通常较小

将table_cache设置为与打开的表和并发连接的数量相匹配。观察open_tables的值,如果它正在快速增长,则需要增加其大小

注:

前面的两个参数可能需要大量打开的文件。20+最大连接数+表缓存*2是一个很好的估计,可以满足您的需求。Linux上的MySQL有一个open_file_limit选项,请设置此限制

如果您有复杂的查询,sort\u buffer\u size和tmp\u table\u size可能非常重要。值将取决于查询复杂度和可用资源,但建议分别从4Mb和32Mb开始

注意:这些是“每个连接”的值,在read\u buffer\u size、read\r\d\u buffer\u size和其他一些值中,这意味着每个连接可能需要这个值。因此,在设置这些参数时,请考虑您的负载和可用资源。例如,仅当MySQL需要进行排序时,才会分配sort\u buffer\u大小。注意:小心不要耗尽内存

如果建立了多个连接(即没有持久连接的网站),则可以通过将thread_cache_size设置为非零值来提高性能。16是一个很好的开始。增加该值,直到创建的线程增长不太快

主键: 每个表只能有一个自动增量列,它必须被索引,并且不能有默认值

键通常是索引的同义词。在列定义中给定键属性主键时,也可以将其指定为仅键。这是为了与其他数据库系统兼容而实现的

主键是唯一的索引,其中所有键列都必须定义为NOTNULL

如果主键或唯一索引只包含一个整型列, 您还可以在SELECT语句中将该列称为“_rowid”

在MySQL中,主键的名称是PRIMARY

目前,只有InnoDB(v5.1?)表支持外键

通常,在创建表时会创建所需的所有索引。 任何声明为主键、键、唯一或索引的列都将被索引


NULL表示“没有值”。要测试NULL,您不能使用算术比较运算符,例如=,,这里是我的一些技巧-我在博客()中写了关于它们的博客

  • 声明变量时不需要使用“@”符号
  • 必须使用分隔符(默认值为“;”)来分隔语句的结尾-
  • 如果您试图在MS-SQL 2005和mySQL之间移动数据,有几个难题需要解决-
  • 在mySQL中进行区分大小写的匹配-

  • 如果您要使用大型和/或高事务性InnoDb数据库,请学习并理解“显示InnoDb状态”,它将成为您的朋友。

    这不是一项隐藏功能,但很有用:

    InnoDb默认情况下将所有表存储在一个永远不会缩小的全局表空间中

    您可以使用
    innodb\u file\u per\u table
    ,它将把每个表放在一个单独的表空间中,当您删除表或数据库时,该表空间将被删除

    提前做好计划,否则必须转储和恢复数据库以回收空间


    如果使用cmdline Mysq,您可以使用尖叫/感叹号与命令行交互(在Linux机器上-不确定在Windows上是否有等效效果)。例如:

    \! cat file1.sql
    
    将显示file1.sql的代码。要将语句和查询保存到文件中,请使用tee工具

    \T filename
    
    要关闭此选项,请使用\t

    最后,要运行已保存的脚本,请使用“源文件名”。当然,正常的替代方法是在从命令行启动mysql时直接输入脚本名:

        mysql -u root -p < case1.sql
    
    mysql-u root-p
    希望这对某人有用

    编辑:刚刚想起一个
    SET AUTOCOMMIT = 0;
    SET FOREIGN_KEY_CHECKS=0;
    
    .. your dump file ..
    
    SET FOREIGN_KEY_CHECKS = 1;
    COMMIT;
    SET AUTOCOMMIT = 1;
    
    Unknown column ‘the first bit of data what you want to put into the table‘ in ‘field list’
    
    INSERT INTO table (this, that) VALUES ($this, $that)
    
    INSERT INTO table (this, that) VALUES ('$this', '$that') 
    
    \! cat file1.sql
    
    \T filename
    
        mysql -u root -p < case1.sql
    
    insert into occurances(word,count) values('foo',1),('bar',1) 
      on duplicate key cnt=cnt+1
    
    pager less
    select lots_of_stuff FROM tbl WHERE clause_which_matches_10k_rows;
    
    pager tee myfile.txt
    select a_few_things FROM tbl WHERE i_want_to_save_output_to_a_file;
    
    CountryLanguage | CREATE TABLE countrylanguage (
      CountryCode char(3) NOT NULL DEFAULT '',
      Language char(30) NOT NULL DEFAULT '',
      IsOfficial enum('T','F') NOT NULL DEFAULT 'F',
      Percentage float(4,1) NOT NULL DEFAULT '0.0',
      PRIMARY KEY (CountryCode,Language)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    
    SELECT   CountryCode
    ,        GROUP_CONCAT(Language) AS List
    FROM     CountryLanguage
    GROUP BY CountryCode             
    
    +-------------+------------------------------------+
    | CountryCode | List                               |
    +-------------+------------------------------------+
    | ABW         | Dutch,English,Papiamento,Spanish   |
    . ...         . ...                                .
    | ZWE         | English,Ndebele,Nyanja,Shona       |
    +-------------+------------------------------------+
    
    SELECT   CountryCode
    ,        GROUP_CONCAT(
                 Language
    ,            IF(IsOfficial='T', ' (Official)', '')
             )               AS List
    FROM     CountryLanguage
    GROUP BY CountryCode
    
    +-------------+---------------------------------------------+
    | CountryCode | List                                        |
    +-------------+---------------------------------------------+
    | ABW         | Dutch (Official),English,Papiamento,Spanish |
    . ...         . ...                                         .
    | ZWE         | English (Official),Ndebele,Nyanja,Shona     |
    +-------------+---------------------------------------------+
    
    SELECT   CountryCode
    ,        GROUP_CONCAT(Language SEPARATOR ' and ') AS List
    FROM     CountryLanguage
    GROUP BY CountryCode
    
    +-------------+----------------------------------------------+
    | CountryCode | List                                         |
    +-------------+----------------------------------------------+
    | ABW         | Dutch and English and Papiamento and Spanish |
    . ...         . ...                                          .
    | ZWE         | English and Ndebele and Nyanja and Shona     |
    +-------------+----------------------------------------------+
    
    SELECT   CountryCode
    ,        GROUP_CONCAT(
             Language
             ORDER BY CASE IsOfficial WHEN 'T' THEN 1 ELSE 2 END DESC
             ,        Language
             )               AS List
    FROM     CountryLanguage
    GROUP BY CountryCode
    
    +-------------+------------------------------------+
    | CountryCode | List                               |
    +-------------+------------------------------------+
    | ABW         | English,Papiamento,Spanish,Dutch,  |
    . ...         . ...                                .
    | ZWE         | Ndebele,Nyanja,Shona,English       |
    +-------------+------------------------------------+
    
    SELECT     Country.Code, Country.Continent, COUNT(CountryLanguage.Language)
    FROM       CountryLanguage 
    INNER JOIN Country 
    ON         CountryLanguage.CountryCode = Country.Code
    GROUP BY   Country.Code
    
    GROUP BY   Country.Code, Country.Continent
    
    SELECT     Country.Code, MAX(Country.Continent), COUNT(CountryLanguage.Language)
    
    SELECT     Country.Code, COUNT(CountryLanguage.Language), CountryLanguage.Percentage
    FROM       CountryLanguage 
    INNER JOIN Country 
    ON         CountryLanguage.CountryCode = Country.Code
    GROUP BY   Country.Code
    
    WHERE (x.id > y.id) OR (x.id = y.id AND x.f2 > y.f2) 
    
    WHERE (x.id, x.f2) > (y.id, y.f2)
    
    SELECT * FROM mytable
    WHERE date(date_colum) BETWEEN '2011-01-01' AND ''2011-03-03';
    
    SELECT * FROM mytable
    WHERE date_column BETWEEN '2011-01-01 00:00:00' AND '2011-03-03 23:59:59'