【发布时间】:2010-07-20 05:21:58
【问题描述】:
过去 10 年的所有项目都使用 Oracle 作为数据库服务器。现在我开始使用 MySQL(最新的稳定版)自己做一个附带项目。
是否有任何问题(Oracle 用户无法按预期工作的事情)?与事务管理、锁定、隔离级别、索引等相关的任何事情。
我主要是一名 Java 开发人员,所以我对如何从应用服务器查看数据库感兴趣。存储过程、(复杂的)视图或任何花哨的东西都不在我对这个项目的关注范围内。
谢谢。
【问题讨论】:
过去 10 年的所有项目都使用 Oracle 作为数据库服务器。现在我开始使用 MySQL(最新的稳定版)自己做一个附带项目。
是否有任何问题(Oracle 用户无法按预期工作的事情)?与事务管理、锁定、隔离级别、索引等相关的任何事情。
我主要是一名 Java 开发人员,所以我对如何从应用服务器查看数据库感兴趣。存储过程、(复杂的)视图或任何花哨的东西都不在我对这个项目的关注范围内。
谢谢。
【问题讨论】:
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。
您猜对了 - 分层查询不支持递归。 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。
【讨论】:
MySQL 是我最喜欢的数据库之一。我已经使用它多年了,效果很好。在大型 Oracle 调优工作后不久切换,我有一些很好的并行想法。
我会仔细观察内存水平。它们不是自调整的,系统范围和每个线程的内存缓存和使用可能需要仔细调整。
查询缓存大部分是全局的。这会在启用缓存时导致全局锁定条件。
在大多数情况下和 MySQL 的大部分时间里,每次查询的每个表出现都被限制为一个索引。这会增加您在高性能情况下所需的索引数量。
从端的数据库复制是单线程的。这意味着在相同的硬件条件下,主设备的写入速度远快于从设备的写入速度。
另外,请注意区分大小写。有时它在那里,大多数时候它不在。这可能会让人感到困惑。
【讨论】:
与当前的 MySQL - Basic SQL 将完全相同,但 MySQL 不能很好地处理大型表/数据库。在中端英特尔至强服务器上的 MyISAM 上大约有 1000 万个条目,数据错误开始出现。
但是,由于甲骨文收购了 MySQL,这些差异最终可能会消失。
【讨论】: