MySQL的隐藏特性

多年以来,我一直在使用Microsoft SQL Server ,但最近才刚刚开始使用MySQL与我的Web应用程序,我渴望知识。

为了继续处理“隐藏function”这个长长的问题 ,我想知道MySQL的任何隐藏或方便的function,希望能够提高我对这个开源数据库的了解。

既然你提出了一个赏金,我会分享我的辛苦的秘密…

一般来说,我今天调用的所有SQL都需要使用子查询。 来自Oracle数据库世界之后,我认为理所当然的东西与MySQL不一样。 而且我对MySQL调优的阅读让我得出结论:MySQL在优化查询方面落后于Oracle。

虽然大多数B2C应用程序所需的简单查询对于MySQL来说可能很适合,但Intelligence Reporting所需的大多数汇总报表types似乎都需要一定的规划和重新组织SQL查询来指导MySQL更快地执行它们。

行政:

max_connections是并发连接的数量。 默认值是100个连接(从5.0开始为151) – 非常小。

注意:

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

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

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

注意:

前两个参数可能需要很多打开的文件。 20 + max_connections + table_cache * 2是一个很好的估计你需要什么。 Linux上的MySQL有一个open_file_limit选项,设置这个限制。

如果你有复杂的查询sort_buffer_size和tmp_table_size可能是非常重要的。 值将取决于查询的复杂性和可用的资源,但4Mb和32Mb分别是推荐的起点。

注意:这些是“每个连接”值,在read_buffer_size,read_rnd_buffer_size和其他一些值中,这意味着每个连接可能都需要这个值。 因此,在设置这些参数时,请考虑您的负载和可用资源。 例如sort_buffer_size只有在MySQL需要进行sorting时才会被分配。 注意:注意不要用尽内存。

如果build立了许多连接(即没有持久连接的网站),则可以通过将thread_cache_size设置为非零值来提高性能。 16开始是很好的价值。 增加值,直到你的threads_created增长不是很快。

首要的关键:

每个表只能有一个AUTO_INCREMENT列,它必须被索引,并且不能有一个DEFAULT值

KEY通常是INDEX的同义词。 当在列定义中给出时,键属性PRIMARY KEY也可以被指定为KEY。 这是为了与其他数据库系统兼容而实现的。

PRIMARY KEY是一个唯一索引,其中所有键列必须定义为NOT NULL

如果PRIMARY KEY或UNIQUE索引只包含一个具有整数types的列,则还可以在SELECT语句中将该列引用为“_rowid”。

在MySQL中,PRIMARY KEY的名字是PRIMARY

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

通常,在创build表格时创build所需的所有索引。 声明为PRIMARY KEY,KEY,UNIQUE或INDEX的任何列都将被索引。

NULL意味着“没有价值”。 要testingNULL,您不能使用算术比较运算符,如=,<或<>。 改用IS NULL和IS NOT NULL运算符:

NO_AUTO_VALUE_ON_ZERO将自动增加为0,以便只有NULL才会生成下一个序列号。 如果0已被存储在表的AUTO_INCREMENT列中,则此模式可能很有用。 (顺便说一句,存储0不是一个推荐的做法。)

要更改要用于新行的AUTO_INCREMENT计数器的值,请执行以下操作:

 ALTER TABLE mytable AUTO_INCREMENT = value; 

或SET INSERT_ID = value;

除非另有说明,否则值将以1000000开始或者如下指定:

…)ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 1

戳:

TIMESTAMP列的值从当前时区转换为UTC存储,从UTC转换到当前时区以供检索。

http://dev.mysql.com/doc/refman/5.1/en/timestamp.html对于表中的一个TIMESTAMP列,可以将当前时间戳分配为默认值和自动更新值&#x3002;

在WHERE子句中使用这些types之一时要注意一点,最好是在WHERE datecolumn = FROM_UNIXTIME(1057941242)而不是WHERE UNIX_TIMESTAMP(datecolumn)= 1057941242.做后者不会利用索引在那一栏。

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

  UNIX_TIMESTAMP() FROM_UNIXTIME() UTC_DATE() UTC_TIME() UTC_TIMESTAMP() 

如果您在MySQL中将date时间转换为unix时间戳:
然后加24小时:
然后将其转换回date时间,它神奇地失去了一个小时!

这是发生了什么事。 在将unix时间戳转换回date时间时,考虑了时区,恰好在2006年10月28日至29日之间,我们停止了夏令时并且失去了一个小时。

从MySQL 4.1.3开始,CURRENT_TIMESTAMP(),CURRENT_TIME(),CURRENT_DATE()和FROM_UNIXTIME()函数会返回连接当前时区中的值,该时区可用作time_zone系统variables的值。 另外,UNIX_TIMESTAMP()假定它的参数是当前时区中的date时间值。

当前时区设置不会影响由UTC_TIMESTAMP()或DATE,TIME或DATETIME列中的值显示的值。

注意:ON UPDATE ONLY更新date时间,如果一个字段被更改如果更新结果没有字段被更改,那么DateTime不会被更新!

另外,即使没有指定,第一个TIMESTAMP默认为AUTOUPDATE

与date一起工作时,我几乎总是对Julian Date进行讨论,因为数据math是一个简单的加法或减法整数,而自Midnight出于同样的原因则是Seconds。 很less有我需要比秒钟更细粒度的时间resoultion。

这两个都可以作为一个4字节的整数存储,如果空间非常紧密,可以将它作为一个无符号整数组合到UNIX时间(自1970年1月1日以来的秒数),直到2106左右为止:

24小时= 86400秒

整数最大值= 2147483647 – 可以保存68年的秒数

'无符号整数最大值= 4,294,967,295 – 可以保持136年的秒

二进制协议:

MySQL 4.1引入了一个二进制协议,允许以string格式发送和返回非string数据值,而无需转换为string格式。 (非常有用)

另外,mysql_real_query()比mysql_query()更快,因为它不调用strlen()来对语句string进行操作。

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html二进制协议支持服务器端预处理语句,并允许以本机格式传输数据值&#x3002; 在早期版本的MySQL 4.1中,二进制协议经历了相当多的修改。

您可以使用IS_NUM()macros来testing字段是否具有数字types。 将types值传递给IS_NUM(),如果该字段是数字,则计算结果为TRUE:

有一点需要注意的是,二进制数据可以在一个普通的查询中发送,如果你逃脱它,记住MySQL 需要反斜杠和引号字符被转义。 所以这是一个非常简单的方法来插入较短的二进制string,例如encryption/盐渍密码。

主服务器:

http://www.experts-exchange.com/Database/MySQL/Q_22967482.html

http://www.databasejournal.com/features/mysql/article.php/10897_3355201_2

GRANT REPLICATION SLAVE ON 到slave_user IDENTIFIED BY'slave_password'

 #Master Binary Logging Config STATEMENT causes replication to be statement-based - default log-bin=Mike binlog-format=STATEMENT server-id=1 max_binlog_size = 10M expire_logs_days = 120 #Slave Config master-host=master-hostname master-user=slave-user master-password=slave-password server-id=2 

二进制日志文件必须为:

http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

http://www.mydigitallife.info/2007/10/06/how-to-read-mysql-binary-log-files-binlog-with-mysqlbinlog/

http://dev.mysql.com/doc/refman/5.1/en/mysqlbinlog.html

http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

http://dev.mysql.com/doc/refman/5.1/en/binary-log-setting.html

您可以使用RESET MASTER语句或其中的一部分使用PURGE MASTER删除所有二进制日志文件

–result-file = binlog.txt TrustedFriend-bin.000030

正常化:

http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html

UDFfunction

http://www.koders.com/cpp/fid10666379322B54AD41AEB0E4100D87C8CDDF1D8C.aspx

http://souptonuts.sourceforge.net/readme_mysql.htm

数据types:

http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html

http://www.informit.com/articles/article.aspx?p=1238838&seqNum=2

http://bitfilm.net/2008/03/24/saving-bytes-efficient-data-storage-mysql-part-1/

有一点需要注意的是,在一个同时具有CHAR和VARCHAR的混合表上,mySQL将把CHAR更改为VARCHAR

RecNum integer_type UNSIGNED NOT NULL AUTO_INCREMENT,PRIMARY KEY(RecNum)

根据标准的SQL和ISO 8601规范,MySQL总是表示第一年的date

其他:

调整一些MySQlfunction将导致更小的数据文件和更快的访问。 例如:

–datadir将指定数据目录和

–skip-innodb将closuresinno选项并为您节省10-20M

更多在这里http://dev.mysql.com/tech-resources/articles/mysql-c-api.html

下载第7章 – 免费

InnoDB是事务性的,但是会带来性能开销。 我发现MyISAM表格足以满足我的90%的项目。 非事务安全表(MyISAM)具有自己的几个优点,所有这些都是因为:

没有交易开销:

快多了

降低磁盘空间要求

执行更新所需的内存较less

每个MyISAM表都以三个文件存储在磁盘上。 这些文件的名称以表名开头,并有一个扩展名来指示文件types。 .frm文件存储表格格式。 数据文件具有.MYD(MYData)扩展名。 索引文件具有.MYI(MYIndex)扩展名。

这些文件可以在不使用MySQLpipe理员备份function的情况下完整地复制到存储位置,这非常耗时(还原)

诀窍是使这些文件的副本,然后删除表。 当你把文件放回MySQl会识别他们,并更新表跟踪。

如果您必须备份/恢复,

还原备份或从现有转储文件导入可能需要很长时间,具体取决于每个表上的索引和主键的数量。 您可以通过使用以下方法修改原始转储文件来显着加速此过程:

 SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS=0; .. your dump file .. SET FOREIGN_KEY_CHECKS = 1; COMMIT; SET AUTOCOMMIT = 1; 

要大大提高重载的速度,请添加SQL命令SET AUTOCOMMIT = 0; 在转储文件的开头,并添加COMMIT; 命令到最后。

默认情况下,自动提交function处于打开状态,这意味着转储文件中的每个插入命令将被视为单独的事务,并在下一个启动之前写入磁盘。 如果您不添加这些命令,将大型数据库重新加载到InnoDB可能需要很多时间…

MySQL表中一行的最大大小是65535字节

MySQL 5.0.3中的VARCHAR的有效最大长度以及on =最大行大小(65,535字节)

VARCHAR值在存储时不会被填充。 当存储和检索值时,将保留尾随空格,符合标准SQL。

MySQL中的CHAR和VARCHAR值进行比较,不考虑尾随空格。

如果整个logging是固定的大小,使用CHAR只会加速您的访问。 也就是说,如果你使用任何可变大小的对象,你也可以使所有的可变大小。 通过在还包含VARCHAR的表中使用CHAR,您不会获得任何速度。

自MySQL 5.0.3起,255个字符的VARCHAR限制被提高到65535个字符

只有MyISAM表格支持全文search。

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

BLOB列没有字符集,sorting和比较基于列值中字节的数值

如果严格SQL模式未启用,并且将值分配给超出列最大长度的BLOB或TEXT列,则该值将被截断以生成警告。

有用的命令:

检查严格模式:SELECT @@ global.sql_mode;

closures严格模式:

SET @@ global.sql_mode ='';

SET @@ global.sql_mode ='MYSQL40'

或删除:sql-mode =“STRICT_TRANS_TABLES,…

显示列从mytable

SELECT max(namecount)AS virtualcolumn FROM mytable ORDER BY virtualcolumn

http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-fields.html

http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id last_insert_id()

获取当前线程中插入的最后一行的PK max(pkcolname)让你获得最后一个PK。

注意:如果表为空,则max(pkcolname)返回1 mysql_insert_id()将本机MySQL C API函数mysql_insert_id()的返回types转换为longtypes(在PHP中名为int)。

如果AUTO_INCREMENT列的列types为BIGINT,则由mysql_insert_id()返回的值将不正确。 相反,在SQL查询中使用内部MySQL SQL函数LAST_INSERT_ID()。

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

只要注意,当你试图插入数据到表中,并得到错误:

 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') 

提醒“用于定义MySQL字段,数据库或表,而不是值;)

在查询期间与服务器失去连接:

http://dev.mysql.com/doc/refman/5.1/en/gone-away.html

http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html

http://dev.mysql.com/doc/refman/5.0/en/server-parameters.html

http://dev.mysql.com/doc/refman/5.1/en/show-variables.html

http://dev.mysql.com/doc/refman/5.1/en/option-files.html

http://dev.mysql.com/doc/refman/5.1/en/error-log.html

调整查询

http://www.artfulsoftware.com/infotree/queries.php?&bw=1313

那么这应该足以赢得奖金,我会认为…许多小时的成果和许多项目与一个伟大的免费数据库。 我主要使用MySQL在Windows平台上开发应用程序数据服务器。 我必须理顺的最糟糕的混乱是

最终的MySQL遗留数据库的噩梦

这需要一系列的应用程序来处理这些表格,使用这里提到的许多技巧。

如果您发现这种方法非常有用,请投票expression您的感谢。

另请查看我的其他文章和白皮书:www.coastrd.com

其中一个并不那么隐藏的function是,它并不是真的很擅长SQL,不是真正的bug,而是更多的陷阱 … 🙂

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

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

(来自MySQL性能博客 )

一个命令来找出谁在做什么:

 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对inet_ntoa()inet_aton()的内置支持。 它使表格中的IP地址处理非常简单(至less只要他们只有IPv4地址!)

我喜欢on duplicate key (AKA upsert,合并)为各种各样的计数器懒洋洋地创build:

 insert into occurances(word,count) values('foo',1),('bar',1) on duplicate key cnt=cnt+1 

您可以在一个查询中插入多行,并立即处理每个行的重复索引。

再次 – 不是真正隐藏的function,但真的很方便:

特征

轻松抢DDL:

SHOW CREATE TABLE CountryLanguage

输出:

 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 

特征:GROUP_CONCAT()聚合函数为每个细节创build其参数的连接string,并通过连接每个组的聚合。

例1:简单

 SELECT CountryCode , GROUP_CONCAT(Language) AS List FROM CountryLanguage GROUP BY CountryCode 

输出:

 +-------------+------------------------------------+ | CountryCode | List | +-------------+------------------------------------+ | ABW | Dutch,English,Papiamento,Spanish | . ... . ... . | ZWE | English,Ndebele,Nyanja,Shona | +-------------+------------------------------------+ 

例2:多个参数

 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 | +-------------+---------------------------------------------+ 

示例3:使用自定义分隔符

 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 | +-------------+----------------------------------------------+ 

示例4:控制列表元素的顺序

 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 | +-------------+------------------------------------+ 

function:具有多个expression式的COUNT(DISTINCT)

您可以在COUNT(DISTINCT …)expression式中使用多个expression式来计算组合的数量。

SELECT COUNT(DISTINCT CountryCode, Language) FROM CountryLanguage

特征/窍门:不需要在GROUP BY列表中包含非聚合expression式

大多数RDBMS-es强制执行符合SQL92的GROUP BY,要求SELECT列表中的所有非聚集expression式都显示在GROUP BY中。 在这些关系数据库中,这样的陈述:

 SELECT Country.Code, Country.Continent, COUNT(CountryLanguage.Language) FROM CountryLanguage INNER JOIN Country ON CountryLanguage.CountryCode = Country.Code GROUP BY Country.Code 

无效,因为SELECT列表包含未汇总的列Country.Continent,它不出现在GROUP BY列表中。 在这些RDBMS-es中,您必须修改GROUP BY列表来读取

 GROUP BY Country.Code, Country.Continent 

或者你必须添加一些无意义的聚合到Country.Continent,例如

 SELECT Country.Code, MAX(Country.Continent), COUNT(CountryLanguage.Language) 

现在,事实上,逻辑上没有什么要求Country.Continent应该被聚合。 请参阅Country.Code是Country表的主键。 Country.Continent也是国家表中的一列,因此通过定义在function上取决于主键Country.Code。 因此,Country.Code中必须存在Country.Continent中的一个值。 如果你意识到这一点,你会意识到把它聚合起来是没有意义的(只有一个值,正确的),也不能把它分组(因为它不会使得结果更加独特,因为你已经分组了PK)

无论如何 – MySQL允许您在SELECT列表中包含非聚合列,而不需要将它们添加到GROUP BY子句中。

与此有关的是,如果你碰巧使用非聚合列,MySQL不会保护你。 所以,这样的查询:

 SELECT Country.Code, COUNT(CountryLanguage.Language), CountryLanguage.Percentage FROM CountryLanguage INNER JOIN Country ON CountryLanguage.CountryCode = Country.Code GROUP BY Country.Code 

将毫无怨言地执行,但CountryLanguage.Percentage列将包含无意义(也就是说,在所有语言百分比中,百分比的可用值之一将随机选取,或者至less在您的控制范围之外。

请参阅: 通过神话揭穿群体

客户端中的“传呼机”命令

如果你的结果中有10,000行,并且想要查看它们(这里假定有“less”和“tee”命令可用,这在Linux下是正确的;在Windows YMMV中)。

 pager less select lots_of_stuff FROM tbl WHERE clause_which_matches_10k_rows; 

你会得到他们在“less”文件查看器,所以你可以通过他们很好地页面,search等

 pager tee myfile.txt select a_few_things FROM tbl WHERE i_want_to_save_output_to_a_file; 

将方便地写入一个文件。

有些事情您可能会感兴趣:

 <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 

不是一个隐藏的function,但有用的: http : //mtop.sourceforge.net/

这里是我的一些小技巧 – 我在博客上发表博文( 链接 )

  1. 声明variables时不需要使用“@”符号。
  2. 您必须使用分隔符(默认值为';')来划分语句的结尾 – 链接
  3. 如果你试图在MS-SQL 2005和mySQL之间移动数据,那么有几个环节可以跳过–Link
  4. 在mySQL 链接中做区分大小写的匹配

如果您要与大型和/或高交易量的InnoDb数据库一起学习并了解“SHOW INNODB STATUS” Mysql性能博客 ,它将成为您的朋友。

如果使用cmdline Mysq,则可以通过使用尖括号/感叹号与命令行进行交互(在Linux计算机上 – 不确定在Windows上是否有等效的效果)。 例如:

 \! cat file1.sql 

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

 \T filename 

关掉这个\ t

最后运行你已经保存的脚本,使用“源文件名”。 当然,正常的select是从命令行启动mysql时直接在脚本名称中:

  mysql -u root -p < case1.sql 

希望对某人有用!

编辑:只记得另一个 – 当从命令行调用mysql时,您可以使用-t开关,以便输出是表格格式 – 一些查询真正的恩惠(尽pipe当然在这里别处提到的\ G的终止查询也是在这方面很有帮助)。 更多的各种开关命令行工具

只是find了一个整洁的方式来改变sorting的顺序(通常使用案例…)如果你想改变sorting的顺序(也许sorting1,4,3,2而不是1,2,3, 4)您可以使用Order by子句中的字段function。 例如

按字段sorting(sort_field,1,4,3,2)

  • 在这里find这个在MySQL用户gms8994 命令由day_of_week

我不认为这是MySQL特有的,但对我来说:

而不是写作

 WHERE (x.id > y.id) OR (x.id = y.id AND x.f2 > y.f2) 

你可以写

 WHERE (x.id, x.f2) > (y.id, y.f2) 

mysqlsla – 最常用的慢查询日志分析工具之一。 自上次推出慢速查询日志以来,您可以看到排名前10位的查询。 它还可以告诉你BAD查询被触发的次数以及在服务器上花费的总时间。

实际logging ,但非常烦人:不正确的date和其他不正确的input自动转换。

在MySQL 5.0.2之前,MySQL会宽恕非法或不正确的数据值,并将其强制为合法的数据input值。 在MySQL 5.0.2及更高版本中,这仍然是默认行为,但您可以更改服务器SQL模式以select更为传统的错误值处理方式,以便服务器拒绝它们并中止它们出现的语句。

至于date:有时你会是“幸运”,当MySQL不调整input到附近的有效date,而是存储为按照定义是无效的。 然而,即使这样,你可能已经想要MySQL失败,而不是为你默默存储这个值。

内置的SQL Profiler 。

InnoDB默认将所有表存储在一个永远不会缩小的全局表空间中。

您可以使用innodb_file_per_tableinnodb_file_per_table放置在一个单独的表空间中,当您删除表或数据库时将被删除。

为此提前计划,因为您必须转储和还原数据库才能回收空间。

使用每个表格空间

如果插入到datetime列的空string值“”,MySQL将保留00/00/0000 00:00:00的值。 不像甲骨文,这将保存空值。

在使用大型数据集和DATETIME字段的基准testing期间,执行此查询总是比较慢:

 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'