다양한 테이블을 기반으로 하는 거대한 MariaDB/Mysql 테이블을 "필터링"합니다.
P粉287345251
P粉287345251 2023-09-07 10:51:26
0
2
583

MariaDB 데이터베이스에서 대규모 데이터 세트로 작업합니다. 두 개의 테이블이 있습니다. 테이블 A에는 5,700만 개의 행이 있고 테이블 B에는 약 500개의 행이 있습니다. 테이블 B는 테이블 A의 열과 관련된 ID의 하위 집합입니다. A 테이블 B의 모든 행을 삭제하고 싶습니다.

예제 표 A:

분류_ID 이름
20 메르세데스
30 가와사키
80 라이츠
70 HP

예제 표 B:

분류_ID 유형
20 자동차
30 자전거
40 버스
50 보트

따라서 이 예에서는 테이블 A의 마지막 두 행이 삭제됩니다(또는 처음 두 행만 포함하는 미러링된 테이블이 생성되며 이 역시 작동합니다).

내부 조인을 사용하여 두 번째 쿼리를 실행하려고 시도했지만 이 쿼리는 메모리 부족 예외가 발생하기까지 몇 분 정도 걸렸습니다.

이 문제를 해결하는 방법에 대한 제안이 있으십니까?

P粉287345251
P粉287345251

모든 응답(2)
P粉258083432

필터링된 테이블에 상대적으로 적은 수의 행이 포함되어 있다고 말씀하셨으므로 가장 좋은 옵션은 조인 대신 원본 테이블로 별도의 테이블을 만드는 것입니다A 相同的列以及与您的匹配的行criteria,然后替换原始表并删除它。另外,对于如此数量的 ID,您可能希望使用 WHERE IN (). 거기에서 사용하는 필드가 인덱싱되어 있는 한 일반적으로 way em>가 더 빠릅니다. 종합해보면:

으아악

주의사항:

  • 데이터를 백업하세요! 그리고 DROP TABLE을 실행하기 전에 쿼리를 철저히 테스트하세요. StackOverflow의 무작위 답변으로 인해 57M 행의 데이터가 손실되는 것을 원하지 않습니다.
  • if A 有任何索引或外键,这些将不会被复制 - 因此您必须手动重新创建它们。我建议首先运行 SHOW CREATE TABLE A 并记下其结构。或者,您可以考虑使用 SHOW CREATE TABLE A 的输出作为模板显式创建表 new_A,然后执行 INSERT INTO new_A SELECT ... code> 而不是 CREATE TABLE new_A AS SELECT ... 이후에는 동일한 쿼리를 사용합니다.
P粉155832941

이것을 시도해 보세요:

으아악
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿