찾다

 >  Q&A  >  본문

다양한 테이블을 기반으로 하는 거대한 MariaDB/Mysql 테이블을 "필터링"합니다.

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粉287345251P粉287345251485일 전608

모든 응답(2)나는 대답할 것이다

  • P粉258083432

    P粉2580834322023-09-08 09:32:15

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

    으아악

    주의사항:

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

    회신하다
    0
  • P粉155832941

    P粉1558329412023-09-08 00:49:06

    이것을 시도해 보세요:

    으아악

    회신하다
    0
  • 취소회신하다