MySQL的隐藏特性
我已经工作多年了,但最近才开始使用我的web应用程序,我渴望知识MySQL的隐藏特性,mysql,database,hidden-features,Mysql,Database,Hidden Features,我已经工作多年了,但最近才开始使用我的web应用程序,我渴望知识 为了继续我的长篇大论,我想知道MySQL的任何隐藏的或方便的特性,这将有助于提高我对这个开源数据库的了解。MySQL的一个不太隐藏的特性是,它不太擅长与SQL兼容,嗯,不是真正的bug,但是,更多…:-) 找出谁在做什么的命令: mysql> show processlist; show processlist; +----+-------------+-----------------+------+---------+-
为了继续我的长篇大论,我想知道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,您不能使用算术比较运算符,例如=,,这里是我的一些技巧-我在博客()中写了关于它们的博客
如果您要使用大型和/或高事务性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'