MySQLSchema设计(二)精打细算,油盐不断(二)

2014-11-24 14:27:46 · 作者: · 浏览: 1
------+------------------------+ 1 row in set (0.00 sec) 因为datetime类型不支持直接计算,时间转化为了数字来相减了才得到此结果的。除了这个bug之外,通常也应该尽可能使用timestamp,毕竟从存储上看,timestamp 仅占 4 个字节,比datetime(8字节)和date(8字节)的空间效率都要高。而且,有的人习惯用 INT UNSIGNED 来存储一个转换成Unix时间戳的时间值,但这不会带来任何收益,MySQL提供的from_unixtime()把Unix时间戳转换成日期,unix_timestamp()把日期转换成Unix时间戳,所以我们没有必要坚持这个习惯,因为timestamp实际上是4个字节的INT值,都用系统默认的时区,相同的字符串值会得到不同的时间戳,反而更加不好处理。

timestamp的行为规则比较复杂,并且不同版本的MySQL会有变动,那么有时候"经验主义"便会让人踢到铁板,所以我们应该验证数据库的行为是你需要的,比较好的做法是,修改完timestamp列后用show create table命令检查输出,以下是同一个DDL语句在不同版本的timestamp展现

create table t (col timestamp);

5.1表现为:

`col` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

5.5 层现是:

 `col` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

5.6 则为:

 `col` timestamp NULL DEFAULT NULL
可见,timestamp在5.6版本的变化是翻天覆地的。

随着经济全球化日益激烈,跨时区倒数据已是家常便饭。创建数据和schema的逻辑备份最常见的选择还是mysqldump,但当我们打开dump文件头会发现" /*!40103 SET TIME_ZONE='+00:00' */; "这么一行。而我们的客户端默认时区是:

mysql> select @@time_zone;
+-------------+
| @@time_zone |
+-------------+
| SYSTEM |
+-------------+
1 row in set (0.00 sec)
mysql> drop table if exists t;

mysql> create table t (col timestamp);

mysql> insert into t select now();

mysql> select * from t;
+---------------------+
| col |
+---------------------+
| 2014-01-25 10:42:44 |
+---------------------+
1 row in set (0.00 sec)

$ mysqldump -uroot -poracle testdb t --where='col="2014-01-25 10:42:44"' | grep INSERT

返回空,导不出数据?下面给出2种解决方案

方法一 加上参数 --tz-utc

$ mysqldump -uroot -p testdb t --tz-utc=0 --where='col="2014-01-25 10:42:44"' | grep INSERT

方法二 用转换函数处理

mysql> select unix_timestamp(col) from t;
+---------------------+
| unix_timestamp(col) |
+---------------------+
| 1390617764 |
+---------------------+
$ mysqldump -uroot -p testdb t --where='col=from_unixtime(1390617764)' | grep INSERT

INSERT INTO `t` VALUES ('2014-01-25 02:42:44');

㈡ 数据类型转换

基本原则:

① 不要在字段前增加函数

如:

② 不要把字段嵌入到表达式中

举个例子吧、假设我在字符列上建立个索引、然后:

㈢ 数据类型优化

下面总结我认为优化数据类型的几条通用原则为:

1、数据类型更小通常更好,数据类型越简单越好

5、多使用enum,set

6、IP用int存:inet_aton()、inet_ntoa()

7、使用decimal而不是float & double

8、MyISAM多使用char、InnoDB多使用varchar