碰巧在过去的10年中,所有的项目都使用Oracle作为数据库服务器。现在我用MySQL (最新的稳定版)开始了一个自己的副业项目。
有没有什么问题( Oracle用户不能正常工作的东西)?任何与事务管理、锁定、隔离级别、索引等相关的东西。
我主要是一名Java开发人员,所以我感兴趣的是如何从应用程序服务器查看数据库。存储过程、(复杂的)视图或任何花哨的东西都不在我的项目范围之内。
谢谢。
发布于 2010-07-20 14:57:32
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。唯一的选择是使用触发器。Unique约束在MySQL中作为索引实现。
自定义错误处理
您需要声明用于自定义错误处理的处理程序:http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html
以前-
MySQL不支持定义自定义错误来区分数据完整性和业务规则错误。
分析/排名/窗口功能
MySQL没有任何这样的功能--没有ROW_NUMBER、NTILE、RANK或DENSE_RANK。你可以使用变量创建psuedo功能--上面有很多例子,所以如果你检查标签"mysql","rank“。
WITH语法-子查询分解
这是another thing MySQL does not have。
分层查询支持
你猜对了--不支持递归的分层查询。Oracle的had CONNECT BY自v2 (!!)开始,但ANSI标准是使用WITH子句,就像您在SQL Server 2005+中看到的那样。
视图
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)的VARCHAR2的4000限制相比,Oracle数据类型更具容纳性。MySQL支持CLOB和BLOB...
包、存储过程、函数
MySQL支持用户定义的函数和存储过程-我还没有遇到过支持类似于Oracle包的数据库。SQL Server具有CLR程序集,但它要求使用TSQL代码而不是本机.NET /PLSQL。
发布于 2010-07-20 13:36:24
MySQL是我最喜欢的DB之一。我已经使用它很多年了,取得了很好的效果。在进行了大量的Oracle调优工作后不久,我切换了一下,我有一些很好的想法。
我会仔细观察内存级别。它们不是自调优的,系统范围和每个线程的内存缓存和使用可能需要仔细调优。
查询缓存在很大程度上是全局的。当启用缓存时,这会导致全局锁定条件。
对于大多数实例和MySQL生命周期的大部分时间,每个查询的每个表只能有一个索引。这增加了在高性能情况下所需的索引数量。
从机端的数据库复制是单线程的。这意味着主机的写入速度比从机使用相同硬件时的写入速度快得多。
另外,要注意区分大小写。有时它是存在的,但大多数情况下它不存在。这可能会让人感到困惑。
发布于 2010-07-20 13:24:38
与当前的MySQL - Basic SQL将完全相同,但MySQL不能很好地处理大表/数据库。在中端英特尔至强服务器上,MyISAM上有大约1000万个条目,开始出现数据错误。
但是,由于甲骨文已经购买了MySQL,这些差异最终可能会消失。
https://stackoverflow.com/questions/3287229
复制相似问题