首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql如何处理涉及myisam和innodb表的查询?

问mysql如何处理涉及myisam和innodb表的查询?
EN

Database Administration用户
提问于 2013-02-22 19:04:20
回答 1查看 2.8K关注 0票数 5

在mysql数据库中,虽然有更多的myisam表,但我们同时使用myisam和innodb表。

问题

  • 如果一个查询同时涉及myisam表和innodb表,那么查询会在innodb表上使用表锁或行锁吗?
  • 这是个好做法吗?
EN

回答 1

Database Administration用户

发布于 2013-02-23 23:17:05

执行一个连接查询有三个方面,可以是令人震惊的

方面#1 :锁定行为

每当有涉及MyISAM和InnoDB的联接时,InnoDB表在表级锁定方面的行为就会像MyISAM一样,而不是其正常的行级锁定。MVCC和酸顺应性不能应用于MyISAM数据。对于InnoDB表,它可能也会停滞不前。

方面#2 :MyISAM的参与

如果通过插入、更新或删除更新任何MyISAM表,则连接查询中涉及的MyISAM表将从其他DB连接中锁定,从而迫使连接查询等待MyISAM表的读取。有鉴于此,如果连接查询中存在InnoDB和MyISAM的混合,则InnoDB表将受到主键项的间歇锁定(在聚集索引中)。

请记住,MVCC仍然允许READ-UNCOMMITTED和REPEATABLE-READ事务可以正常工作,并让某些数据视图可用于其他事务。对于读提交事务和SERIALIZABLE事务,情况并非如此。。

方面#3 :查询优化器对联接

的视图

MyISAM

MySQL将依赖于表的索引基数来确定优化的解释计划。索引基数对于MyISAM表通常是稳定的,直到它被插入、更新和删除淹没为止。因此,您需要定期对OPTIMIZE TABLE表运行MyISAM。

InnoDB

InnoDB的指数基数从来没有稳定过!如果运行SHOW INDEXES FROM innodbtable;,则每次运行该命令时都会看到索引基数发生变化。这是因为InnoDB会深入研究指数来估计基数。即使您对一个OPTIMIZE TABLE表运行InnoDB,这也只会对该表进行碎片整理。OPTIMIZE TABLE将在内部运行ANALYZE TABLE,以便根据表生成索引统计信息。这适用于MyISAM。InnoDB通常会忽略它。您可以禁用诺姆b以获得稳定的解释计划,但这只会导致您像分析MyISAM表一样对InnoDB表进行表维护分析。

尾声

信不信由你,有仍然是InnoDB/MyISAM在更新选择期间加入的开放票证。如果你阅读它,它将决议总结如下:请不要加入混合InnoDB和MyISAM。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/35322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档