我正在研究涉及大量数据库写入的项目,我会说(70%的插入和30%的读取).该比率还包括我认为是一次读取和一次写入的更新.读取可能很脏(例如,在读取时我不需要100%准确的信息).
有问题的任务将是每小时进行超过100万次数据库事务.
我在网上看到了一些关于MyISAM和InnoDB之间差异的东西,对于我将用于此任务的特定数据库/表格来说,MyISAM似乎是我的明显选择.从我似乎正在阅读的内容来看,如果需要事务处理,InnoDB很好,因为支持行级锁定.
有没有人有这种负载(或更高)的经验?MyISAM是走的路吗?
我知道之前已经问过这个问题,但大部分时间都会询问与特定数据库或表格有关的问题.我无法在这个网站上找到描述两个引擎及其差异的答案,而不考虑某些特定数据库.
我希望将来能够在设计表或数据库时做出更明智的决策,所以我正在寻找关于两个存储引擎之间差异的全面答案.
MySql中的MyISAM和Inno数据库类型有什么区别?
我正在一个数据库庞大的网站上工作.当时表中有100万条记录.当我执行查询时,执行需要太多时间.下面给出一个示例查询:
select * from `ratings` order by id limit 499500, 500
Run Code Online (Sandbox Code Playgroud)
每个查询都需要超过一分钟,但是当我将表删除到1万条记录时,此查询会快速执行.
正如我所读到的,表中的100万条记录没有问题,因为在数据库表中,没有大记录的问题.
我已经在Stack Overflow问题的帮助下在表中使用了id的索引如何在MySQL表中添加索引?,但我仍然遇到同样的问题.
***我正在为项目使用CodeIgniter.
长话短说: 我对 2 个巨大的表有一个查询。它们不是索引。它很慢。因此,我建立索引。它比较慢。为什么这是有道理的?正确的优化方法是什么?
的背景:
我有2张桌子
person,包含人员信息的表 ( id, birthdate)works_inperson,与部门之间的0-N关系;works_in包含id, person_id, department_id.它们是 InnoDB 表,遗憾的是不能选择切换到 MyISAM,因为数据完整性是一项要求。
这两个表很大,除了各自PRIMARY的id.
我正在尝试获取每个部门中最年轻的人的年龄,这是我提出的查询
SELECT MAX(YEAR(person.birthdate)) as max_year, works_in.department as department
FROM person
INNER JOIN works_in
ON works_in.person_id = person.id
WHERE person.birthdate IS NOT NULL
GROUP BY works_in.department
Run Code Online (Sandbox Code Playgroud)
该查询有效,但我对性能不满意,因为运行需要大约 17 秒。这是预料之中的,因为数据很大并且需要写入磁盘,并且它们不是表上的索引。
EXPLAIN对于这个查询给出
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra …Run Code Online (Sandbox Code Playgroud) 场景:
事务A开始...
START TRANSACTION;
UPDATE table_name SET column_name=column_name+1 WHERE id = 1 LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
与此同时,事务B开始......
START TRANSACTION;
UPDATE table_name SET column_name=column_name+1 WHERE id = 2 LIMIT 1;
UPDATE table_name SET column_name=column_name-1 WHERE id = 1 LIMIT 1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
现在,事务 B 正在等待行 1,该行被锁定在事务 A 中。
交易A继续进行……
UPDATE table_name SET column_name=column_name-1 WHERE id = 2 LIMIT 1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
现在我们遇到了死锁,因此两个事务都在等待对方解锁它们想要更新的行:'(
正如我在标题中所问的,我们如何防止 RDBMS 事务中的死锁?
我认为解决这种情况的唯一方法是我们回滚事务B并重新执行它。但是我们如何才能发现自己陷入了僵局,并立即摆脱困境,如何保证我们不会陷入死循环(例如,在非常繁重的 Web 应用程序上)。
如果有必要,我会使用 MySQL。但任何适用于其他 RDBMS 的解决方案都是受欢迎的 - 帮助其他从 Google 来到这里的人:)
mysql ×5
database ×4
innodb ×3
myisam ×3
performance ×2
sql ×2
indexing ×1
php ×1
transactions ×1