我有一个遗留的Web应用程序php4 / mysql4(MyISAM,db包含一些cms,一些用户数据,一些日历应用程序)。现在我将使用php5 / mysql5迁移到新服务器。
我是否应该在迁移mysql数据库时更改为InnoDB? - 预期的优势/劣势/风险? - MyISAM已弃用或有朝一日吗?或者我可以安全地保留它吗? - 我听说MyISAM容易腐败,InnoDB怎么样,它是否可以防撞? - InnoDB是否更容易或更安全地进行备份和恢复?
当我更改(打破SQL查询)或破坏逻辑(因为更改的锁定机制)时,它是否会破坏我的代码,如果是这样,典型情况是什么?
(对于php问题,我创建了一个不同的问题:Migrating php4/mysql4 to php5/mysql5: expected php issues?)
答案 0 :(得分:3)
您应该关注的关键是,您的数据库是如何使用的。如果它更像Read而不是Write,那么你应该坚持使用MyISAM,如果它的Read比Read更多,你应该研究InnoDB。
如果你想知道InnoDB和MyISAM之间的区别,那么Wikipedia has a great list就会有所不同。
MyISAM在写入任何现有行时使用表级锁定,而InnoDB使用行级锁定。
对于经常更新许多行的大型数据库应用程序,行级锁定至关重要,因为单个表级锁定会显着降低数据库中的并发性。
答案 1 :(得分:2)
将MySQL v4 / v5升级与表升级分开是值得的。这减少了潜在的问题范围。
也就是说,如果重新启动数据库很少发生,那么在v4 / v5升级之前需要一些时间来查看InnoDB服务器选项,因为其中许多都需要重新启动数据库。推荐的两个是innodb_file_per_table = 1和innodb_flush_log_at_tx_commit = 1(查看它们),你也应该看看innodb_buffer_pool_size,因为如果没有人改变它,它几乎肯定会太低。
MyISAM将会存在很长时间。它是一种非常强大的磁盘格式,具有一些适用于许多情况的特性。特别是,它具有快速SELECT
,这对于没有或只有很少更新的小型表非常有用。也就是说,一个非常热门的表(很多很多SELECT
)将从迁移到InnoDB中受益,因为MyISAM不支持并发读取。
MyISAM几乎总能在数据库崩溃中幸存,只需要REPAIR TABLE
。 InnoDB并不总是那么幸运。 MyISAM也可以从数据库下备份出来;即使你事先没有锁定表,你很可能会得到一个可以正常工作的文件。 InnoDB文件并不那么友善;这就是innodb_hot_copy存在的原因。
我们最近进行了MySQL v4 / v5升级,我们只遇到一个SQL问题:混合模式JOIN
。将隐式表连接与显式LEFT JOIN
子句混合时,版本4的解析器相当宽容。版本5并不那么宽容。因此,我们借此机会搜索应用并将所有JOIN
升级为显式JOIN
。除了错过的一两个地方外,这非常成功。
我建议您使用PHP 4设置与MySQL v5对话的测试环境。这将让你测试所有这些。