MySql使用中的注意点(一)

这篇文章主要针对以前从事企业级应用开发的同学,因为企业级的应用,特别是金融企业通常选用Oracle或者DB2作为数据库。 

与上述要花费大价钱的数据库软件相比,免费的MySql还是有一些局限性,以及一些MySql自身的特点要留心、注意。 

1.在创建外键时,MySql仅支持数字类型的外键。 
这点真的比较恶心,因为表的主键设计既可以有物理主键,同时也可以有逻辑主键。而逻辑主键通常并非仅是数字,可能包含业务说明的英文字母,那这样的逻辑主键是无法被设置为外键的。 
但是如果选用物理主键作为外键,那么在做数据迁移时,特别是将测试环境的数据导入到生产环境中时,必须特别留心要保持数据之间关联关系。 
那么要么把测试数据库中的主键值一起带入到生产数据库中,要么手动修改数据间关联。后者容易照成错误,而前者会破坏数据库主键连续的物理特性, 
更坏的情况是,测试数据库中的主键在生产数据库中已经存在,而不得不使用再手动修改数据间关联的办法。 
所以现在我们的数据库没有建立外键关联,虽然这是一柄双刃剑,但是多少会破坏数据库的完整性设计。 

2.同一张表内设置默认当前时间的Timestamp类型的字段只能有一个。 
例如,通常我们在建立一张表时,即有update_time,也有create_time。我们可能希望这两个字段的默认值都是当前时间,这样在业务程序中可以简化一些代码处理。 
但是不幸的是,同一张表中只能有一个字段被DEFAULT CURRENT_TIMESTAMP修饰。 

3.MySql的Timestamp类型的精度仅到秒。 
这点也没什么好说的,如果业务需求一定要精确到毫秒,那么就保存long型的数字吧。 

4.创建视图的where条件不能包含子查询。 
例如:create view invalidView select * from A a where a.xxx = (select b.xxx from B b where ...) 
即使上述语句去除前面create view invalidView部分可以正常运行,但是创建视图时会被禁止。 
一种解决方案是将子查询变为表连接,另外一种方法是将子查询的逻辑提到字段的部分,即select和from中间。 

5.没有对子查询进行算法优化。 
例如:select * from A a where a.xxx = (select b.xxx from B b where ...) 
上述语句当在Oracle中之间,后面的子查询只会被执行一次,但是在MySql中会被执行n次,n为A表中的数据量。 
所以应该禁止子查询的使用。 
解决办法首先是应该将子查询变为表连接的查询,如果不行,那么请将上述查询分拆为两次查询。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。