相关疑难解决方法(0)

MyISAM与InnoDB

我正在研究涉及大量数据库写入的项目,我会说(70%的插入和30%的读取).该比率还包括我认为是一次读取和一次写入的更新.读取可能很脏(例如,在读取时我不需要100%准确的信息).
有问题的任务将是每小时进行超过100万次数据库事务.

我在网上看到了一些关于MyISAM和InnoDB之间差异的东西,对于我将用于此任务的特定数据库/表格来说,MyISAM似乎是我的明显选择.从我似乎正在阅读的内容来看,如果需要事务处理,InnoDB很好,因为支持行级锁定.

有没有人有这种负载(或更高)的经验?MyISAM是走的路吗?

mysql database performance myisam innodb

853
推荐指数
16
解决办法
29万
查看次数

MyISAM和InnoDB有什么区别?

我知道之前已经问过这个问题,但大部分时间都会询问与特定数据库或表格有关的问题.我无法在这个网站上找到描述两个引擎及其差异的答案,而不考虑某些特定数据库.

我希望将来能够在设计表或数据库时做出更明智的决策,所以我正在寻找关于两个存储引擎之间差异的全面答案.

MyISAM和InnoDB有什么区别,在尝试在一个或另一个之间做什么时,我应该寻找什么?

mysql database myisam innodb

250
推荐指数
2
解决办法
26万
查看次数

MySql:MyISAM与Inno DB!

MySql中的MyISAM和Inno数据库类型有什么区别?

mysql database myisam innodb

43
推荐指数
3
解决办法
2万
查看次数

MySQL语句需要超过一分钟才能执行

我正在一个数据库庞大的网站上工作.当时表中有100万条记录.当我执行查询时,执行需要太多时间.下面给出一个示例查询:

select * from `ratings` order by id limit 499500, 500
Run Code Online (Sandbox Code Playgroud)

每个查询都需要超过一分钟,但是当我将表删除到1万条记录时,此查询会快速执行.

正如我所读到的,表中的100万条记录没有问题,因为在数据库表中,没有大记录的问题.

我已经在Stack Overflow问题的帮助下在表中使用了id的索引如何在MySQL表中添加索引?,但我仍然遇到同样的问题.

***我正在为项目使用CodeIgniter.

php mysql

9
推荐指数
1
解决办法
952
查看次数

MySQL 在大表上索引性能

长话短说: 我对 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)

mysql sql database indexing performance

6
推荐指数
1
解决办法
7208
查看次数

如何防止并发事务中数据库死锁?

场景:

事务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 来到这里的人:)

sql transactions database-deadlocks

4
推荐指数
1
解决办法
8486
查看次数