프로젝트에서 특정 시점에 100명의 사람들이 동일한 데이터를 변경하는 등 높은 동시성 문제에 직면하는 경우가 많습니다. 높은 동시성을 해결하는 일반적인 방법에는 데이터를 읽을 때 캐시를 추가하고 데이터를 쓸 때 캐시를 추가하는 것이 포함됩니다.
1. MySQL 배치 삽입 최적화
데이터량이 많은 일부 시스템의 경우 쿼리 효율성이 낮을 뿐만 아니라 데이터 저장 시간이 길어지는 등의 문제에 직면합니다. 특히 보고 시스템의 경우 데이터 가져오기에 소요되는 시간은 매일 몇 시간에서 10시간 이상 지속될 수 있습니다. 따라서 데이터베이스 삽입 성능을 최적화하는 것이 합리적입니다.
MySQL innodb에 대한 일부 성능 테스트를 마친 후 참조용 삽입 효율성을 향상시킬 수 있는 몇 가지 방법을 찾았습니다.
1. 하나의 SQL 문으로 여러 데이터를 삽입합니다.
일반적으로 사용되는
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1);
삽입 문은 다음과 같이 수정됩니다.
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1);
수정된 삽입 작업은 프로그램의 삽입 효율성을 향상시킬 수 있습니다. 여기서 두 번째 SQL 실행 효율이 높은 주된 이유는 병합 후 로그(MySQL의 binlog와 innodb의 트랜잭션 로그) 양이 줄어들어 로그 플러싱의 양과 빈도가 줄어들어 효율성이 향상되기 때문이다. SQL 문을 병합하면 SQL 문을 구문 분석하는 횟수도 줄어들고 네트워크 전송 IO도 줄일 수 있습니다.
다음은 단일 데이터를 가져와서 가져오기 위해 SQL 문으로 변환하고 각각 100개, 1,000개, 10,000개의 데이터 레코드를 테스트하는 테스트 비교 데이터입니다.
트랜잭션에서도 삽입 처리를 수행할 수 있습니다.