source

MySQL InnoDB의 테이블로 바꾸기 속도가 매우 느립니다.

factcode 2023. 1. 19. 20:59
반응형

MySQL InnoDB의 테이블로 바꾸기 속도가 매우 느립니다.

MySQL(정확히는 MariaDB)을 사용합니다.데이터베이스를 업데이트하려면 다음 스크립트를 이틀에 한 번씩 실행해야 하는데 너무 느립니다.업데이트할 각 테이블을 실행하는 데 몇 시간이 걸립니다.그건...shell스크립트:

CMD_MYSQL="${MYSQL_DIR}mysql  --local-infile=1 --default-character-set=utf8 --protocol=${MYSQL_PROTOCOL} --port=${MYSQL_PORT} --user=${MYSQL_USER} --pass=${MYSQL_PASS} --host=${MYSQL_HOST} --database=${MYSQL_DB}"

### Update MySQL Data ###
## table name are lowercase
tablename=`echo $FILE | tr "[[:upper:]]" "[[:lower:]]"`
echo "Uploading ($FILE) to ($MYSQL_DB.$tablename) with REPLACE option..."
## let's try with the REPLACE OPTION
$CMD_MYSQL --execute="LOAD DATA LOCAL INFILE '$FILE.txt' REPLACE INTO TABLE $tablename CHARACTER SET utf8 FIELDS TERMINATED BY '|' IGNORE 1 LINES;"
## we need to erase the records, NOT updated today
echo "erasing old records from ($tablename)..."
$CMD_MYSQL --execute="DELETE FROM $tablename WHERE datediff(TimeStamp, now()) < 0;"

파일 내의 다른 위치에 설정된 일부 변수는 무시해도 됩니다.$FILE보통이다txt구분된 파일|. 각 행은 하나의 레코드를 나타냅니다.예:

AirportID|AirportCode|AirportName|Latitude|Longitude|MainCityID|CountryCode
6024358|DME|Moscow, Russia (DME-Domodedovo Intl.)|55.414495|37.899907|2395|RU
6024360|DMM|Dammam, Saudi Arabia (DMM-King Fahd Intl.)|26.468075|49.796824|180543|SA

스크립트는 오래된 레코드가 있는 기존 데이터베이스에서 실행됩니다.그런 다음 마지막으로 갱신된 날짜를 체크하고REPLACE INTO단, 100MB의 경우 보통 8시간이 소요됩니다.txt파일.

어떻게 하면 속도를 크게 높일 수 있을까요?

이 문제는 InnoDB(4.1+)의 모든 버전에 영향을 미칩니다.InnoDB의 복제품 교체 속도가 너무 느립니다.MyISAM이 뛰어난 것은 이 때문입니다.MyISAM은 0.05초 걸렸어요

그 이유는 InnoDB에서의 중복된 키 오류 처리가 실행 취소 로그와 문의 롤백에 의존하기 때문입니다.1 .레코드를 잠급니다.2. 레코드를 삭제하기 위한 update_undo 로그 쓰기.3. 레코드를 삽입하기 위한 insert_undo 로그 쓰기.4.새 레코드를 삽입해 보십시오. 5. 중복된 내용을 확인하십시오.6. 3단계와 2단계에서 기록한 실행 취소 로그를 롤백합니다.

이는 2019년 9월 현재 어떤 버전에서도 수정되지 않은 MySQL의 문제입니다.https://bugs.mysql.com/bug.php?id=71507

스텝 2에서 중복을 검출할 예정입니다.이 경우 롤백을 회피할 수 있습니다.

다음은 2가지 제안입니다.

  1. 해당하는 경우 MyISAM 사용
  2. 다음과 같은 쿼리 사용INSERT INTO ... ON DUPLICATE KEY UPDATE ...

언급URL : https://stackoverflow.com/questions/21485394/replace-into-table-in-mysql-innodb-extremely-slow

반응형