mysql에서 테이블 모음의 마지막 업데이트 시간을 결정하는 효율적이고 신뢰할 수 있는 방법이 있습니까?
고전적인 문제:많은 클라이언트 애플리케이션(네이티브 및 웹 앱)이 시스템에 연결되어 있으며, 이 모든 애플리케이션은 정보 변화에 따라 실시간으로 업데이트를 받아야 합니다.대부분의 정보는 거의 변하지 않습니다.그렇게 되면 클라이언트 시스템은 이 사실을 매우 빨리 알아야 합니다.백엔드 시스템은 InnoDB를 스토리지 엔진으로 하는 Galera 클러스터의 MariaDB를 사용합니다.
이러한 문제에 INFORMATION_SCHEMA를 사용할 수 있다는 것을 알고 있지만, 특히 Galera 클러스터 환경에서 INNODB 테이블을 사용할 때는 결정적이지 않습니다.해당 테이블의 UPDATE_TIME에 의존할 경우 메모리 내 버퍼링으로 인해 약간 구식일 가능성이 있습니다.또한 특정 순간에 클러스터의 다른 서버가 이 시간에 대해 다른 값을 가질 수도 있습니다.이게 무슨 큰 일입니까?글쎄요.하지만 정확한 데이터를 제공할 수 있는 솔루션을 찾고 있었고 성능이 뛰어났습니다.
해당 각 테이블에는 인덱스가 있는 'update_at' 열이 있습니다.각 테이블을 개별적으로 조회해 보았습니다(예:select updated_at from TABLE order by updated_at limit 1
), 하지만 이것은 확인해야 할 테이블이 많을 때는 매우 비쌉니다.저장 프로시저를 사용하면 이 작업이 다소 더 효율적이지만 여전히 우아하지는 않습니다.
예를 들어, 여기서 트리거가 말이 됩니까?테이블의 읽기 활동과 비교할 때 테이블은 상대적으로 드물게 업데이트됩니다.ANOTHER 테이블에서 해당하는 last_update된 시간을 업데이트하는 삽입/삭제/업데이트 트리거를 각 테이블에 설정할 수 있습니까?그럼 제가 신경 쓴 데이터가 바뀌었는지 확인하기 위해 저 테이블을 모니터하기만 하면 되는 건가요?데이터가 변경되었음을 알리는 일종의 pub/sub을 사용해야 합니까?그럼 신경 쓰는 사람들이 그것에 동의합니까?
이것은 해결된 문제여야 합니다.제안할 좋은 해결책이 있는 사람?
다음과 같은 방법으로 메타데이터 전반에 걸쳐 쿼리할 수 있습니다.
SELECT MAX(UPDATE_TIME)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'myschema'
하지만 당신은 메타데이터가 당신에게 충분히 정확하지 않다고 말했습니다.
당신은 최신의 것을 받아야 할 것입니다.updated_at
여러 테이블에서:
SELECT MAX(updated_at) AS max_updated_at
FROM (
SELECT MAX(updated_at) AS updated_at FROM mytable1
UNION SELECT MAX(updated_at) FROM mytable2
UNION SELECT MAX(updated_at) FROM mytable3
UNION SELECT MAX(updated_at) FROM mytable4
UNION ...
) AS t
또는 다음과 같습니다.
SELECT GREATEST(
t1.updated_at,
t2.updated_at,
t3.updated_at,
t4.updated_at,
...
) AS max_updated_at
FROM
(SELECT MAX(updated_at) AS updated_at FROM mytable1) AS t1,
(SELECT MAX(updated_at) AS updated_at FROM mytable2) AS t2,
(SELECT MAX(updated_at) AS updated_at FROM mytable3) AS t3,
(SELECT MAX(updated_at) AS updated_at FROM mytable4) AS t4,
...
의견 다시 작성:
질문을 잘못 이해해서 죄송합니다.저는 "테이블 모음의 마지막 업데이트 시간"이 해당 모음의 마지막 업데이트 시간을 의미한다고 생각했습니다.
각 테이블에 대한 마지막 업데이트를 받기 위해 위에 제시한 세 가지 대안 중 하나를 적용할 수 있습니다.
SELECT TABLE_NAME, UPDATE_TIME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'myschema'
또는:
SELECT 'mytable1' AS table_name, updated_at FROM mytable1
UNION SELECT 'mytable2', updated_at FROM mytable2
UNION SELECT 'mytable2', updated_at FROM mytable3
UNION SELECT 'mytable2', updated_at FROM mytable4
UNION ...
또는:
SELECT
t1.updated_at AS mytable1_updated_at,
t2.updated_at AS mytable2_updated_at,
t3.updated_at AS mytable3_updated_at,
t4.updated_at AS mytable4_updated_at,
...
FROM
(SELECT MAX(updated_at) AS updated_at FROM mytable1) AS t1,
(SELECT MAX(updated_at) AS updated_at FROM mytable2) AS t2,
(SELECT MAX(updated_at) AS updated_at FROM mytable3) AS t3,
(SELECT MAX(updated_at) AS updated_at FROM mytable4) AS t4,
...
라면.updated_at
에는 인덱스가 MySQL에는다가 있습니다.MAX()
전체 테이블을 스캔할 필요 없이 인덱스의 마지막 항목부터 빠르게 값을 지정합니다.
언급URL : https://stackoverflow.com/questions/60920707/is-there-an-efficient-reliable-way-to-determine-the-last-update-time-for-a-coll
'programing' 카테고리의 다른 글
Uncatched TypeError: $.post가 함수가 아닙니다. (0) | 2023.10.12 |
---|---|
MS SQL의 TRIGER_NESTLEVEL()과 동등한 MySQL? (0) | 2023.10.12 |
포인터가 가리키는 문자열 크기 찾기 (0) | 2023.10.12 |
mysql의 하위 쿼리 구분 기호 (0) | 2023.10.12 |
응답 내용은 psql로 이동한 후 주어진 __toString(), "boolean"을 구현하는 문자열 또는 개체여야 합니다. (0) | 2023.10.12 |