대량 데이터 수집과 관련된 프로젝트를 작성 중입니다. 현재 저는 .NET Framework 4.8과 Mysql 패키지를 사용하여 연결을 시작하고 데이터베이스 서버에 데이터를 삽입하고 있습니다.
초당 약 400,000행을 삽입하게 됩니다. SQL 연결이 내 프로그램에 병목 현상을 일으킬까봐 걱정됩니다. SQL을 사용하여 다중 스레드 연결을 생성하고 소비자 대기열을 사용하여 데이터를 삽입하는지 알고 싶습니다. 더 빠르고 가치가 있습니까(장단점)?
내 직감으로는 더 빠를 것 같지만 스레드 오버헤드 측면에서 얼마나 많은 성능을 제공할지는 잘 모르겠습니다. 저는 SQL 전문가가 아니기 때문에 누군가가 여러 스레드에서 SQL에 대한 여러 연결을 여는 것의 장단점을 설명할 수 있다면 좋을 것입니다.
루머, 의견, 소문, 사실, 버전 관련 벤치마크, 개인적인 경험 등...
다중 스레드는 처리량을 향상시킬 수 있지만 다음과 같은 제한 사항이 있습니다.
일괄 처리:
LOAD DATA
是一次从单个线程INSERT
大量行的最快方法。但是,如果您包括将文件写入LOAD
비용으로 인해 일괄 삽입보다 속도가 느려질 수 있습니다.INSERT
가 이어집니다. 그러나 특정 한도 또는 "수익률 감소"에 도달하면 "수백" 행으로 제한됩니다.LOAD DATA
)할 가치가 있습니다. (출처: 많은INSERT
查询插入一行的速度的 10 倍。因此,它(或LOAD DATA
다양한 시간 제한 테스트.)일부 데이터 소스는 한 번에 한 행만 전송해야 합니다(예: N초마다 차량의 센서 데이터). 이를 위해서는 데이터를 일괄 처리하기 위한 중간 계층이 필요합니다.-
데이터 수집에 대한 토론: - http://mysql.rjweb.org/doc.php /staging_table
데이터를 로드한 후에는 어떻게 되나요? 물론 이것은 쓰기 전용 테이블은 아닙니다.정규화는 디스크 공간을 줄이는 데 유용하며 일괄적으로 수행하는 것이 가장 좋습니다.-
표준화를 참조하세요.
- 결국 오래된 데이터를 지우는 것 외에는 거의 유용하지 않습니다.
거대한 "사실" 테이블은 검색하기 어렵습니다. 수집할 때 요약 데이터 구축을 고려하세요. -
요약 테이블
위 처리를 수행한 다음 원본 데이터를 버릴 수도 있습니다. 하루에 테라바이트의 데이터를 얻는 것 같습니다. -
PARTITIONing
파티션을 참조하세요.