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가지 제안입니다.
- 해당하는 경우 MyISAM 사용
- 다음과 같은 쿼리 사용
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
언급URL : https://stackoverflow.com/questions/21485394/replace-into-table-in-mysql-innodb-extremely-slow
'source' 카테고리의 다른 글
등록되지 않은 컴포넌트를 기반으로 한 Vue.js 빌드에 실패할 수 있습니까? (0) | 2023.01.19 |
---|---|
Django 이행: django.db.utils.Operation Error: (1364, "필드 '이름'에 기본값이 없습니다") (0) | 2023.01.19 |
j선택에서 옵션 제거 쿼리 (0) | 2023.01.19 |
html의 php 변수는 다음과 같습니다.html의 php 변수는 다음과 같습니다. (0) | 2023.01.19 |
휴지 상태 - 배치 업데이트에서 업데이트에서 예기치 않은 행 수가 반환되었습니다: 0 실제 행 수: 0 예상: 1 (0) | 2023.01.19 |