过去10年中,所有项目都是Oracle作为数据库服务器。现在,我正在开始自己的MySQL项目(最新的稳定版)。
是否存在任何陷阱(Oracle用户无法正常工作)?与事务管理,锁定,隔离级别,索引,那种东西有关。
我主要是一名Java开发人员,所以我对如何从应用服务器看到数据库感兴趣。存储过程,(复杂)视图或任何花哨的东西都不在我这个项目的雷达上。
谢谢。
答案 0 :(得分:11)
MySQL有各种引擎 - 主要是INNODB和MyISAM。 MyISAM does not support transactions, nor foreign key constraints。隔离级别相似 - 这些天数据似乎在数据库之间相对标准。
索引不同 - MySQL具有聚簇索引和非聚簇索引。聚簇索引通常用于主键,但不一定。还有a limit on the space for defining indexes - 767 for INNODB, 1,000 for MyISAM。支持覆盖索引,不支持基于函数的索引......
优化器每个SELECT子句只能使用一个索引 - 检查EXPLAIN PLAN输出。有指定要使用的索引的语法,但它是一个提示&仍然可以被优化器忽视。
MySQL有CHECK constraint syntax, but no engine enforces it currently。唯一的选择是使用触发器。 MySQL中的唯一约束作为索引实现。
您需要为自定义错误处理声明处理程序:http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html
以前 -
MySQL不支持定义自定义错误以区分数据完整性和业务规则错误。
MySQL没有任何此类功能 - 没有ROW_NUMBER,NTILE,RANK或DENSE_RANK。您可以使用变量创建伪造的功能 - 如果您检查标签“mysql”,“rank”,那么SO上有很多示例。
这是another thing MySQL does not have。
你猜对了 - 没有递归支持分层查询。从v2(!!)开始,Oracle有CONNECT BY,但ANSI标准是使用你在SQL Server 2005 +中看到的WITH子句。
MySQL不支持实体化视图和view support is crippled - can't use subqueries, for example。
这是ANSI标准语法; Oracle在11g开始支持,但MySQL再次不支持这一点。只有选项是CASE表达式和聚合函数,它仍然是实现此功能的最便携方式(SQL Server 2005+支持PIVOT / UNPIVOT)。
MySQL不支持序列,最接近的是将INT列定义为auto_increment。这使得在两个或多个表中使用相同的值序列非常困难(如果您不需要,则不是您真正想要的)。此外,每个表只能定义一个auto_increment列。 increment and offset is instance-wide - 更改它,并影响实例所服务的每个数据库中的每个auto_increment列。重置auto_increment值需要ALTER TABLE权限;删除/截断数据不会改变当前值。
在这方面,MySQL不支持RETURNING子句。 You need to use LAST_INSERT_ID()
to retrieve the auto_increment value for a newly created row
MySQL没有NUMBER数据类型 - it splits numerics into INT, MEDIUMINT, etc.。在这方面,MySQL与SQL Server非常相似。 MySQL's TEXT (TINYTEXT, TEXT, MEDIUMTEXT, and LONGTEXT)数据类型比Oracle VARCHAR2的4000限制更容易。 MySQL支持CLOB和BLOB ......
MySQL支持用户定义的函数和存储过程 - 我还没有遇到支持类似于Oracle软件包的数据库。 SQL Server具有CLR程序集,但它需要使用.NET CLR代码而不是本机TSQL / PLSQL。
答案 1 :(得分:2)
MySQL是我最喜欢的数据库之一。我已经使用它多年,效果很好。在经过大量的Oracle调优工作后不久,我就有了一些好的并排思路。
我会仔细观察内存水平。它们不是自我调整,系统范围和每个线程内存缓存和用法可能需要仔细调整。
查询缓存大部分都是全局的。启用缓存时,这会导致全局锁定。
对于大多数实例和MySQL的大部分时间,每个查询每个表的出现次数限制为一个。这会增加高性能情况下所需的索引数量。
从属端的数据库复制是单线程的。这意味着主机的写入速度远远快于从机可以用相同的硬件写入的速度。
另外,请注意区分大小写。有时它存在,大多数情况下不存在。这可能会让人感到困惑。
答案 2 :(得分:0)
使用当前的MySQL - Basic SQL将完全相同,但MySQL不能很好地处理大型表/ db。 MyISAM在中端英特尔至强服务器上的大约1000万条目,数据错误开始出现。
但是,由于甲骨文购买了MySQL,这些差异可能最终消失。