MyISAM 如何比 InnoDB“更快”,如果
RAM 的重要性是一个既定的事实,但在 MySQL 使用 CPU 时,关于内核和多线程重要性的资料要少得多。我说的是在 4cores vs 6cores vs 8cores 上运行 MySQL 的区别等等。
不同的存储引擎使用 CPU 的方式不同吗?
我有一个很烦人的问题。我想使用 INNODB 作为我的主要数据库引擎并放弃 MyISAM,因为我需要前者来使用 galera-cluster 进行冗余。
我将newbb_post表复制(描述如下)到一个名为的新表newbb_innopost并将其更改为 InnoDB。每个表当前都保存5,390,146条目。
在新启动的数据库上运行这些选择(因此此时不涉及缓存!)数据库产生以下结果(省略完整的输出,请注意我什至不要求数据库对结果进行排序):
SELECT post.postid, post.attach FROM newbb_post AS post WHERE post.threadid = 51506; . . | 5401593 | 0 | | 5401634 | 0 | +---------+--------+ 62510 行(0.13 秒)
SELECT post.postid, post.attach FROM newbb_innopost AS post WHERE post.threadid = 51506; . . | 5397410 | 0 | | 5397883 | 0 | +---------+--------+ 62510 行(1 分 22.19 秒)
0.13 秒到 86.19 秒 (!)
我想知道为什么会这样。我确实在 Stackexchange 上阅读了一些涉及 InnoDB …
我有一个大约 100 个表的数据库来存储各种信息。
最重要的表是我们的订单表,用于存储客户订单,截至目前已超过 100000 条记录,并且还在不断增长。
该表是我们数据库中查询最多的表,用于获取实时订单仪表板、统计数据、分析等所需的各个部分信息。
我定期监视数据库,并在数据库上启用慢速查询以跟踪问题。
我每天都使用像 mysqltuner 这样的脚本来输出查询。
我还使用 mysqlsla 收集有关我们数据库中前 10 个最慢查询的信息。
sample stat
Count : 11.48k (30.66%)
Time : 19.623758 s total, 1.709 ms avg, 239 µs to 2.475017 s max (18.64%)
95% of Time : 5.246833 s total, 481 µs avg, 239 µs to 1.095 ms max
Lock Time (s) : 14.460071 s total, 1.259 ms avg, 53 µs to 2.462555 s max (41.38%)
95% of Lock : 806.43 ms total, 74 µs avg, …Run Code Online (Sandbox Code Playgroud) 我们有一个 MySQL 5.0 服务器,以 MyISAM 的形式运行所有表。我们有两个奴隶,在上个月,我们已经升级到 MySQL 5.5。他们的表也仍然是 MyISAM。
我原来的计划是把5.0的master升级到5.5,然后转成InnoDB。现在我想知道,在升级之前开始是否更有意义?我一直很谨慎,因为我听说 5.5 下的 InnoDB 比 5.0 下的 InnoDB 快得多。这是没有根据的,我现在应该开始吗?
有时,我会在我的 PHP 错误日志中发现很多这些错误:
MYSQL.1213: Deadlock found when trying to get lock; try restarting transactionSQL
Run Code Online (Sandbox Code Playgroud)
问题持续约 2 或 3 分钟。感谢stackoverflow,原因很容易找到:
------------------------
LATEST DETECTED DEADLOCK
------------------------
130320 15:53:37
*** (1) TRANSACTION:
TRANSACTION 0 83395751, ACTIVE 35 sec, process no 26405, OS thread id 140507872417536 starting index read
mysql tables in use 3, locked 3
LOCK WAIT 3 lock struct(s), heap size 1216, 2 row lock(s)
MySQL thread id 1163191, query id 199629038 localhost sosci Updating
UPDATE `database`.`table` SET `invalidate`='2013-03-21 03:53:02' …Run Code Online (Sandbox Code Playgroud) 我有一个数据库,由于一些问题,我需要将一些表从 MyISAM 转换为 InnoDB。
我基本上是这样做的:
set sql_log_bin = 0;
set sql_mode = 'STRICT_ALL_TABLES';
ALTER TABLE `table1` ENGINE = INNODB;
ALTER TABLE `table2` ENGINE = INNODB;
ALTER TABLE `table3` ENGINE = INNODB;
ALTER TABLE `table4` ENGINE = INNODB;
ALTER TABLE `table5` ENGINE = INNODB;
ALTER TABLE `table6` ENGINE = INNODB;
Run Code Online (Sandbox Code Playgroud)
它工作正常,但据我所知,我现在应该重新配置 my.cnf 然后重新启动 mysql 服务器,对吗?
如果服务器同时包含 MyISAM 和 InnoDB 表,我应该如何调整 my.cnf 文件?
我不确定这个问题的答案是对还是错,因为我认为这在很大程度上取决于情况,但为了心理锻炼,我还是继续问吧:
我的数据库中有一个 MyISAM 表,它位于我的站点的中心。围绕它创建了许多参考表,还有许多其他表直接链接到该表中的行 ID。该表大约有 260k 行,有 28 个字段,其中大部分是 varchars 和 ints。我有大约 15 个索引(数据大约 70 MiB,索引大约 80 MiB)。每天可能有数百次写入,而读取数以万计。我的数据库位于 SSD 驱动器上。
现在我的问题是;将此表更改为 InnoDB 表是否有益?我正在努力扩展我的系统以包括 API 流量,这意味着该表甚至会被查询更多,我想确保一切运行尽可能顺利。因此,我有点倾向于将其转换为 InnoDB。但是,由于该表需要许多索引,我认为 MyISAM 可能会更有效地工作。谁能帮我下定决心?提前致谢1
我很久以前就添加了索引,并且我对 PHP 代码库进行了一些更改,因此可能有些索引已经过时,但总体而言;是的,它们都被使用了。我在表上运行了许多不同类型的查询。不同的查询,不同的索引。但是我在这里的主要问题不涉及表读取性能,而是它如何处理许多索引。InnoDB 索引与数据一起“离开”/存储,而不是 MyISAM 的密钥文件原则。我只是担心这可能会导致足够的性能下降不会超过表锁定问题。
我有一个关于 MySQL 锁定和事务管理的问题。我的问题是 ..mysql 是否锁定了我在事务中执行选择/更新的元组/表?
我们有 14 GB 的 CSV,总计 1.38 亿行。我首先使用 InnoDB 将其导入到 MySQL 表中,然后使用 MyISAM 再次尝试。在这两种情况下,对主键(只是一个自动递增的 int)的简单 SELECT 需要 6-7 秒,尽管 MyISAM 有时在 5-6 秒时快一点。
我们只需要写一次数据,我一直在使用mysqlimport。考虑到这一点,如何提高查询速度?
...我们有 2 演出 RAM 并且一切都是一张表,这毫无价值(并且由于查询的性质,它必须保持这种状态)。考虑到硬件,这是我可以期待的最佳性能吗?或者还有什么我应该尝试的,比如压缩?或者真的,我需要更多的内存?
mysql ×10
innodb ×7
myisam ×7
performance ×3
mysql-5.5 ×2
deadlock ×1
hardware ×1
index ×1
locking ×1
my.cnf ×1
optimization ×1
transaction ×1