it-swarm-ko.tech

데이터베이스 테이블을 InnoDB로 변환 한 후 대량 업데이트가 느려졌습니다.

MyISAM에서 데이터베이스 테이블을 InnoDB 엔진으로 변환 한 후, 특히 관리 작업을 위해 여러 노드를 대량으로 업데이트 할 때 일부 작업이 매우 느려짐을 발견했습니다. 프런트 엔드 성능이 좋은 것 같습니다.

운없이이 기사에서 제안한 구성 설정을 시도했습니다 : MySQL> YourSQLMySQL Performance Blog .

내 테스트 스크립트는 25 개의 다른 노드 (node_load())를로드하고 즉시 루프에 저장합니다 (node_save()). 이 스크립트는 MyISAM 엔진이있는 서버에서 2 초 동안 실행됩니다. InnoDB로 DB 변환 후 13 초가 걸립니다.

또한 500MB의 SQL 덤프에서 InnoDB 데이터베이스를 복원하는 데 훨씬 더 오래 걸립니다. 20 분 (InnoDB) 대 2 분 (MyISAM).

이것이 InnoDB 엔진에서 기대해야하는 것입니까?

InnoDB 엔진을 처음 접하는 저는 InnoDB를 구성하고 최적화 할 때 여전히 누락 된 것이 무엇인지 알고 싶습니다.

6
Ki Kim

좋은 팁에 감사드립니다. 나는 제안 된 InnoDB 튜닝 팁의 대부분을 시도했지만 내 문제를 해결하기에 충분하지 않았습니다.

문제를 해결할 수 있었던 방법은 다음과 같습니다. 이것은 내 상황과는 별 개인 특별한 경우 일 수 있지만 비슷한 상황에있는 다른 개발자에게 도움이되기를 바랍니다.

25 개의 노드가있는 루프에서 node_save ()를 실행했을 때 MyISAM에서는 2 초, InnoDB에서는 13 초가 걸렸습니다.

단일 루프에서 node_save ()에 의해 생성 된 80 개의 데이터베이스 쿼리를 캡처했습니다. 그중 일부는 node_save () 전에 필요한 node_load () 실행에서 나왔습니다. 데이터베이스 쿼리 정보 수집의 devel 모듈 기능을 사용했습니다. 나는 쿼리를 나란히 놓았다. InnoDB의 동일한 쿼리는 특히 모든 쿼리의 대부분을 차지하는 간단한 SELECT 쿼리의 경우 MyISAM보다 약간 빠릅니다.

총 80 개의 쿼리가 0.6 초가 걸렸을 때 0.5 초 이상 걸리는 InnoDB 측의 INSERT 쿼리를 식별했습니다. 쿼리는 노드가 저장 될 때마다 후크 구현이 실행 된 알림 모듈에서 가져 왔습니다.

질의에서 notification_fields 테이블로 범위를 좁히고 value 열에 대한 테이블에 인덱스를 생성하기로 결정했습니다. 그 결과가 모든 차이를 만들었습니다.value, 이제 25 개의 노드를 절약하는 데 0.2 초 밖에 걸리지 않습니다 (13 초에서 감소). MyISAM보다 10 배 더 빠릅니다! (BTW, MyISAM 테이블에 인덱스를 생성하면 이전보다 10 배 빠르게 실행됩니다)

이 경우 InnoDB의 성능이 저하되어 인덱스가 필요하다는 단서를 제공했음을 인정해야합니다. 상황을 숨길만큼 충분히 빠르기 때문에 MyISAM으로 인덱스에 대해 알지 못했을 것입니다.

색인을 추가하면 사이트 성능이 상당히 향상되는 몇 가지 사례가 있습니다. 그러나 실제 적용 및 결과는 사이트마다 다를 수 있습니다. 내 경우에는 notification_fields 테이블로 돌아가서 field 열에 다른 인덱스를 추가하여 성능 향상을 기대하면서 효과를 망쳐 실제로 다시 느리게 만들었습니다. 따라서 인덱스를 추가 할 때주의해야하며 사이트의 수정 사항 중 하나가 다른 사이트에서 동일한 방식으로 작동하지 않을 수 있음을 이해해야합니다.

9
Ki Kim

특히 DDL (테이블 생성 등) 문은 InnoDB에서 느립니다. 그것이 바로 그 방법입니다.

또 다른 차이점은 InnoDB는 트랜잭션을 사용하고 MyISAM은 사용하지 않는다는 것입니다. 따라서 기본적으로 자동 커밋이 on으로 설정되어 있으면 각 업데이트/삽입/삭제 쿼리 후에 명시 적 커밋을 수행합니다.

속도를 높이는 가장 쉬운 방법은 대량 업데이트 전에 명시 적으로 트랜잭션을 시작한 다음 마지막에 커밋하는 것입니다.

불행히도 D6 데이터베이스 API에는 데이터베이스에 구애받지 않는 방식으로이를 수행 할 수있는 방법이 없으므로 MySQL 용 실제 SQL 주석에 의존해야합니다.

db_query('START TRANSACTION');

db_query('COMMIT');

자세한 내용은 http://dev.mysql.com/doc/refman/5.0/en/commit.html 을 참조하십시오.

이미 이러한 업데이트의 속도를 크게 높일 것입니다.

7
Berdir