말 그대로 미친 대답이지만, 어떤 종류의 복제 시스템이 설정되어 있다면 (십억 개의 행을 가진 시스템에 대해 희망합니다) 거친 추정기를 사용할 수 있습니다 (예 : MAX(pk)
그 값을 슬레이브 수로 나눌 수 있습니다 여러 쿼리를 병렬로 실행하십시오.
대부분의 경우 가장 좋은 키 (또는 내가 추측 한 기본 키)를 기준으로 슬레이브에서 쿼리를 분할합니다 (250000000을 행 / 슬레이브로 사용합니다).
-- First slave
SELECT COUNT(pk) FROM t WHERE pk < 250000000
-- Ith slave where 2 <= I <= N - 1
SELECT COUNT(pk) FROM t WHERE pk >= I*250000000 and pk < (I+1)*250000000
-- Last slave
SELECT COUNT(pk) FROM t WHERE pk > (N-1)*250000000
그러나 SQL 만 필요합니다. 무슨 흉상. 자, 당신이 sadomasochist라고 가정 해 봅시다. 마스터 (또는 가장 가까운 슬레이브)에서 다음을 위해 테이블을 만들어야 할 것입니다.
CREATE TABLE counter_table (minpk integer, maxpk integer, cnt integer, slaveid integer)
따라서 슬레이브에서 선택을 실행하는 대신 다음과 같은 삽입을 수행해야합니다.
INSERT INTO counter_table VALUES (I*25000000, (I+1)*250000000, (SELECT COUNT(pk) FROM ... ), @@SLAVE_ID)
마스터의 테이블에 쓰는 슬레이브에 문제가 발생할 수 있습니다. 더 창의적이고 창의적인 것을 원할 수도 있습니다.
-- A table per slave!
INSERT INTO counter_table_slave_I VALUES (...)
결국 첫 번째 슬레이브와 관련하여 복제 그래프가 통과 한 경로의 마지막에 슬레이브가 있어야합니다. 해당 슬레이브는 이제 다른 모든 카운터 값을 가져야하며 자체 값을 가져야합니다. 그러나 완료 할 때까지 행이 추가되었을 수 있으므로 counter_table 및 현재 최대 pk에 기록 된 최대 pk를 보상하는 다른 행을 삽입해야합니다.
이 시점에서 총 행 수를 파악하기 위해 집계 함수를 수행해야하지만 최대 "사용중인 슬레이브 수 및 변경"행에서 실행하기 때문에 더 쉽습니다.
슬레이브에 별도의 테이블이있는 경우 UNION
필요한 모든 행을 얻을 수 있습니다 .
SELECT SUM(cnt) FROM (
SELECT * FROM counter_table_slave_1
UNION
SELECT * FROM counter_table_slave_2
UNION
...
)
또는 약간 덜 미쳤고 데이터를 분산 처리 시스템으로 마이그레이션하거나 데이터웨어 하우징 솔루션 (미래에도 멋진 데이터 크 런칭을 제공함)을 사용할 수도 있습니다.
이것은 복제가 얼마나 잘 설정되어 있는지에 달려 있습니다. 기본 병목 현상은 영구 스토리지 일 가능성이 높기 때문에 고르지 않은 스토리지 또는 인접 노이즈가 심한 분리 된 데이터 저장소가있는 경우 단일 대기 시간보다 느리게 실행될 수 있습니다.SELECT COUNT(*) ...
그러나 복제가 양호하면 속도 향상은 숫자 또는 슬레이브와 직접 관련되어야합니다. 실제로 계산 쿼리를 단독으로 실행하는 데 10 분이 걸리고 8 개의 슬레이브가있는 경우 시간을 몇 분 미만으로 줄입니다. 이 솔루션의 세부 사항을 다룰 시간이있을 수도 있습니다.
물론,이 분산 해결은 행을 삭제하고 삽입 할 수있는 약간의 시간을 소개하기 때문에 놀랍도록 정확한 답변을 얻지 못하지만 동일한 인스턴스에서 분산 된 행 잠금을 얻고 정확한 수를 얻을 수 있습니다 특정 시점에 대한 테이블 행의
실제로 이것은 기본적으로 SQL 전용 솔루션을 사용하고 있기 때문에 불가능한 것으로 보이며 여러 슬레이브에서 즉시 샤드 및 잠긴 쿼리를 실행하는 메커니즘이 제공되지 않았다고 생각합니다. 어쩌면 복제 로그 파일을 제어 할 수 있다면 ...이 목적을 위해 문자 그대로 슬레이브를 가동하고 있다는 것을 의미합니다. 어쨌든 단일 컴퓨터에서 카운트 쿼리를 실행하는 것보다 느릴 것입니다.
내 2013 페니 두 개가 있습니다.