【问题标题】:mysql db engine when to usemysql db引擎何时使用
【发布时间】:2015-03-14 09:37:23
【问题描述】:

我正在尝试找出最适合我们每个表和要求的 MySQL 表引擎。

具有多次读取(SELECT 查询)的表是 MyISAM。 具有许多写入(插入/更新查询)的表是 InnoDB。这是我们唯一使用的两种类型,但现在我们有不同的场景,我们不知道哪种数据库引擎最好。

1)我们有一个表users,我们经常更新/选择,比如每秒 1 行用于 SELECT,每 1 秒 1 行用于 UPDATE,但插入很少见,比如每 300 秒 1 行。为此,我们选择了 MyISAM

2) 我们有一个表users_data,我们在表users 中插入数据的频率与我们在表users 中的插入频率一样,例如每300 秒一次,但我们不会太频繁地更新此表,但我们每隔一段时间就会读取一次1秒。为此,我们选择了 MyISAM

3)我们有一个表transactions,我们经常在其中插入数据,例如每 4-5 秒插入 1 行,并且我们每 20-30 秒从中选择大包(我们经常根据此表生成许多 SUM在用户 ID 上)。为此,我们选择了 MyISAM

4)我们有一个表transactions_logs,我们在其中存储 id(与transactions 表相同)、商家名称、电子邮件,我们经常插入数据,比如每 4-5 秒插入 1 行,但我们很少读这个。为此,我们选择了 InnoDB。 我们很少加入表transactionstransactions_logs 进行统计。

5)我们有一个表pages,我们只经常选择数据,比如每秒 1 行。为此,我们选择了 MyISAM 并开启了 MySQL 缓存。

问题:

a)我们有另一个表,每 100000 秒有 1 个 INSERT,但每秒有很多 SELECT/UPDATE 查询?这应该是什么类型的?对于这种类型,我们现在使用 MyISAM。 我们从中读取数据,修改它,然后更新它,我们每 1-2 秒执行一次。 MyISAM 是最好的选择吗?

b) 你认为我们应该对所有表都使用 InnoDB 吗?我读到自 MySQL 5.6 以来,InnoDB 是默认的表类型,并且可能进行了很多优化。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    从根本上说,我使用 MyISAM 和 InnoDB 之间的以下两个区别来选择在特定场景中使用哪一个:

    • InnoDB 支持事务,MyISAM 不支持。
    • InnoDB 具有行级锁定,MyISAM 具有表级锁定。

    (来源:MySQL 5.7 Reference Manual

    我的经验法则是当有大量 select 查询和少量 update/insert 查询时使用 MyISAM。每当写入性能或数据完整性很重要时,我都会使用 InnoDB。

    虽然以上内容作为起点很有用,但每个数据库和每个应用程序都是不同的。您的硬件和软件设置的具体细节最终将决定哪种引擎选择是最好的。如有疑问,请测试!

    但是,我会说,根据所提供的数字,并假设“现代”服务器硬件,您并没有接近 MySQL 的性能限制,因此任何一个引擎都足够了。

    【讨论】:

    • 因此,如果您有一个存储帐户余额的表,并且该字段每 1 秒读取和更新一次……您会选择什么?我选择了 MyISAM。
    • 我会使用 InnoDB;如果对update 使用行锁定而不是表锁定,以确保事务完整性并减少读取问题。但是,如果您想确保在您的情况下做出最佳选择,您必须在相关条件下测试和比较两种引擎。
    • 我已经测试过了,我对结果并不满意。我会尝试 InnoDB。 InnoDB 默认使用行锁吗?
    • 是的;来自manual:“InnoDB 在行级别上进行锁定,并在默认情况下以非锁定一致性读取的形式运行查询,采用 Oracle 的风格。”
    • 所以据我了解,MyISAM 似乎锁定了整个表,然后执行会话 A 的所有查询,然后解锁表,然后对每个会话执行相同操作,从而减慢数据库读/写过程.另一方面,InnoDB 只锁定被修改的行(大部分时间是具有唯一 id 的行,仅对应于当前登录的用户),因此其他用户/会话不会受到行锁定的影响。这是正确的吗?
    【解决方案2】:

    MyISAM 非常适合只读加载和永久写入和读取加载。它通过在写入时锁定整个表来处理并发。这可能会使写入繁重的负载变得非常慢。

    INNODB 稍微复杂一些,增加了一些配置选项,必须配置得稍微合适一些。这增加了对行级锁定的支持,这对于添加的行非常有用,理想情况下更新少于每秒 1 次(提供足够的时间来读/写)。

    【讨论】:

    • 因此,如果您有一个存储帐户余额的表,并且该字段每 1 秒读取和更新一次……您会选择什么?我选择了 MyISAM。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    相关资源
    最近更新 更多