programing

실제 효과가 없는 트랜잭션은 온디스크 데이터베이스에 영향을 미칩니까?

newsource 2022. 11. 7. 22:36

실제 효과가 없는 트랜잭션은 온디스크 데이터베이스에 영향을 미칩니까?

외부 데이터 원본에 표시되지 않는 행을 비활성(업데이트 등)으로 표시하여 일부 테이블 행을 업데이트해야 할 상황이 있습니다.active=0). 간단한 해결책은BEGIN거래,UPDATE까지 모든 줄에active=0리모트 데이터를 스캔하여UPDATE각 엔트리에 대해active=1다시 돌려놓기 위해서요약 1k개의 행이 있기 때문에 비효율적인 쿼리 파싱이 많더라도 비교적 빠른 작업이 될 것입니다.

그러나 이 데이터는 전혀 변경되지 않는 경우가 많습니다.따라서 대부분의 경우 거래의 순효과는 영(0)변화가 될 것이다.데이터베이스 엔진이 모든 것을 해결하고 아무것도 변경되지 않은 것을 감지하고 그 결과 아무것도 변경하지 않는 것이 이상적입니다.단, 실제로 모든 행을 업데이트 할 경우 매번 다른 솔루션을 찾고 싶습니다.

여기 데모가 있습니다.간단한 정수만 일렬로 늘어선 테이블을 만들었습니다.

mysql> create table t ( i int );
mysql> insert into t set i = 42;

현재 로그 쓰기 횟수를 확인합니다.

mysql> show status like 'innodb_log_write_requests';
+---------------------------+---------+
| Variable_name             | Value   |
+---------------------------+---------+
| Innodb_log_write_requests | 5432152 |
+---------------------------+---------+

그런 다음 UPDATE를 사용하여 행의 값을 변경하고 로그가 기록되었는지 확인합니다.

mysql> update t set i = 43;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> show status like 'innodb_log_write_requests';
+---------------------------+---------+
| Variable_name             | Value   |
+---------------------------+---------+
| Innodb_log_write_requests | 5432153 |
+---------------------------+---------+

다음으로 실제 효과가 없는 업데이트를 만듭니다.

mysql> update t set i = 43;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

공지Changed: 0.

로그 기입을 확인합니다.또한 변경되지 않았습니다.

mysql> show status like 'innodb_log_write_requests';
+---------------------------+---------+
| Variable_name             | Value   |
+---------------------------+---------+
| Innodb_log_write_requests | 5432153 |
+---------------------------+---------+

디스크 I/O는 no-op에 대한 것으로 거의 결론이 난 것 같습니다.이제 당면 과제에 대해 설명하겠습니다.

실제로 데이터베이스를 수정하는 대신 비활성화할 수 있는 항목 목록을 메모리에 보관할 수 있습니까?검색을 수행한 후 비활성화할 항목이 있는 경우 한 번에 모두 비활성화합니다.UPDATE ... WHERE id IN (...)

다른 주제로...만약 당신이 실제로 이것을 한다면

BEGIN;
UPDATE a=0;  -- for all rows
COMMIT;
-- all are disabled briefly
BEGIN;
UPDATE a=1 WHERE id = ...  -- one row at a time
COMMIT;

그러면 모든 것이 비활성화되는 창이 나타납니다.당신은 아마 그걸 원하지 않을 거예요.

언급URL : https://stackoverflow.com/questions/57661889/does-a-transaction-with-no-net-effect-touch-the-database-on-disk