【问题标题】:long-time Oracle user switching to MySQL, any gotchas to be aware of?长期使用 Oracle 用户切换到 MySQL,有什么需要注意的问题吗?
【发布时间】:2010-07-20 05:21:58
【问题描述】:

过去 10 年的所有项目都使用 Oracle 作为数据库服务器。现在我开始使用 MySQL(最新的稳定版)自己做一个附带项目。

是否有任何问题(Oracle 用户无法按预期工作的事情)?与事务管理、锁定、隔离级别、索引等相关的任何事情。

我主要是一名 Java 开发人员,所以我对如何从应用服务器查看数据库感兴趣。存储过程、(复杂的)视图或任何花哨的东西都不在我对这个项目的关注范围内。

谢谢。

【问题讨论】:

    标签: sql mysql oracle plsql


    【解决方案1】:

    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 的示例。

    WITH 语法 - 子查询分解

    这是another thing MySQL does not have

    分层查询支持

    您猜对了 - 分层查询不支持递归。 Oracle 自 v2 (!!) 以来就有 CONNECT BY,但 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) 数据类型比 Oracle 的 VARCHAR2 的 4000 限制更宽松。 MySQL 支持 CLOB 和 BLOB...

    包、存储过程、函数

    MySQL 支持用户定义函数和存储过程 - 我还没有遇到支持类似于 Oracle 包的数据库。 SQL Server 有 CLR 程序集,但它需要使用 .NET CLR 代码而不是本机 TSQL/PLSQL。

    【讨论】:

    • +1。只是吹毛求疵,CONNECT BY 支持在 Oracle 中确实很古老:它在 Oracle 7 doc (1992) 中有描述,但可能出现得更早。
    • CONNECT BY 支持从版本 2 开始在 Oracle 中
    • 更不用说不等同于 Oracle 11 的 PIVOT 和 UNPIVOT
    • MySQL 也有优点。 TEXT 数据类型,而不是受 Oracle VARCHAR2 的 4000 字节的限制; auto_increment 而不是需要在 Oracle 中使用序列
    • @Vincent Malgrat:见 Rob 的评论,显然支持从 v2 开始! @Rob:更新了,谢谢!
    【解决方案2】:

    MySQL 是我最喜欢的数据库之一。我已经使用它多年了,效果很好。在大型 Oracle 调优工作后不久切换,我有一些很好的并行想法。

    我会仔细观察内存水平。它们不是自调整的,系统范围和每个线程的内存缓存和使用可能需要仔细调整。

    查询缓存大部分是全局的。这会在启用缓存时导致全局锁定条件。

    在大多数情况下和 MySQL 的大部分时间里,每次查询的每个表出现都被限制为一个索引。这会增加您在高性能情况下所需的索引数量。

    从端的数据库复制是单线程的。这意味着在相同的硬件条件下,主设备的写入速度远快于从设备的写入速度。

    另外,请注意区分大小写。有时它在那里,大多数时候它不在。这可能会让人感到困惑。

    【讨论】:

      【解决方案3】:

      与当前的 MySQL - Basic SQL 将完全相同,但 MySQL 不能很好地处理大型表/数据库。在中端英特尔至强服务器上的 MyISAM 上大约有 1000 万个条目,数据错误开始出现。

      但是,由于甲骨文收购了 MySQL,这些差异最终可能会消失。

      【讨论】:

      • 我认为 Larry Ellison 不太可能允许以破坏 Oracle 数据库许可市场的方式增强 MySQL。
      • 这可能更多是硬盘问题。许多网站使用 MyISAM 来处理非常大的表格;我已经将它用于包含 670 万个论坛帖子的表格,这很好。 MyISAM 的问题在于并发性。
      猜你喜欢
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2010-12-08
      • 2018-12-24
      • 1970-01-01
      相关资源
      最近更新 更多