실제 효과가 없는 트랜잭션은 온디스크 데이터베이스에 영향을 미칩니까?
외부 데이터 원본에 표시되지 않는 행을 비활성(업데이트 등)으로 표시하여 일부 테이블 행을 업데이트해야 할 상황이 있습니다.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
'programing' 카테고리의 다른 글
(String) or .toString()? (0) | 2022.11.07 |
---|---|
쿠키 또는 로컬 스토리지 없이 사용자 인식 가능 (0) | 2022.11.07 |
결과를 기다리지 않는 php exec 명령(또는 이와 유사) (0) | 2022.11.07 |
array_module을 객체에 적용하시겠습니까? (0) | 2022.11.07 |
1부터 시작하는 인덱스를 사용하여 PHP에서 어레이를 다시 인덱싱하려면 어떻게 해야 합니까? (0) | 2022.11.07 |