2008-09-16 3 views
4

저는 InnoDB의 안전성, 일관성 및 자체 점검을 좋아합니다.MyISAM 테이블을보다 안전하게 사용할 수있는 방법은 무엇입니까?

하지만 MyISAM의 속도와 경량이 필요합니다.

충돌, 잘못된 데이터 등으로 인해 MyISAM을 손상시키지 않는 방법은 무엇입니까? 수표 (CHECK TABLE 또는 myisamchk)를 통과하는 것은 영원히 필요합니다.

나는 트랜잭션 보안을 요구하지 않고있다. InnoDB가 그 것이다. 하지만 데이터베이스를 원한다면 나중에 몇 시간 (또는 며칠)이 아닌 빨리 다시 시작할 수 있습니다.

업데이트 : 데이터를 테이블로 빠르게로드하는 방법을 묻지 않습니다. 나는 이미 그것을 상대로 내 머리를 때리고, 나의 LOAD DATA를위한 MyISAM 테이블을 사용하는 것이 훨씬 더 빠르다는 것을 결정했다. 이제 내가하는 것은 입니다.은 MyISAM 테이블을 사용하고 있습니다. 즉, 손상 가능성을 줄이고 복구 속도를 높입니다.

답변

0

당신은 MySQL과 결혼 했습니까? Postgres은 (innoDB와 같이) ACID를 준수하고 (잘 튜닝 된 경우) MyISAM처럼 거의 빠릅니다.

+0

예 저는 MySQL과 결혼했습니다. 연주 해줘서 고마워. – JBB

3

MyISAM의 예상 속도는 실제로 상당히 빨리 사라질 수 있습니다. 행 수준의 잠금이 없다는 사실은 작은 업데이트로 인해 많은 양의 데이터가 잠길 수 있고 쿼리가 차단되는 것을 의미합니다. 그렇기 때문에 MyISAM의 속도면에서 장점이 있다고 회의적입니다. 몇 가지 UPDATE를 시작하면 초당 쿼리 수가 늘어납니다.

"InnoDB로 백업 한 응용 프로그램을 어떻게 더 빠르게 만들 수 있습니까?" 그 대답은 가벼운 캐쉬의 객체 레벨에서 데이터를 캐싱하는 것입니다. ACID는 비용이 들지만, 웹 애플리케이션의 경우에는 실제로 필요하지 않습니다.

업데이트가없는 경우 (MyISAM이 적합하지 않은 경우) MySQL 쿼리 캐시를 사용할 수도 있습니다.

memcached (http://www.danga.com/memcached/)는 객체 캐싱을위한 매우 인기있는 옵션입니다. 응용 프로그램에 따라 다른 옵션도 있습니다 (HTTP 캐시 등)

+0

아니, 주요 문제는 놀랍도록 디스크 집약적 인 데이터를 테이블에 처음 가져 오는 것입니다. MyISAM 시간 : 12 분. InnoDB 시간 : 3+ 시간. 초기로드 후에는 UPDATE가 존재하지 않고 INSERT가 거의 발생하지 않습니다. InnoDB의 실망스러운로드 작업에 대한 알려진 솔루션이 없습니다. – JBB

+0

시간은 어디에서 보내고 있습니까? 테이블의 키를 비활성화하고 데이터를로드 한 다음 키를 활성화합니까? 데이터를 테이블로 가져 오거나 키를 다시 만드는 데 시간이 소요됩니까?여러 개의 INSERT 문을 사용하거나 LOAD DATA를 사용하고 있습니까? –

+0

시간이 디스크에 쓰는 데 소비되었습니다. "disable keys"는 innodb 테이블에서는 작동하지 않고 myisam에서만 작동합니다. innodb는 데이터를 삽입 할 때 키를 빌드하고 다시 빌드합니다. 향상된 INSERT 문과 LOAD DATA INFILE 문 (mysqlimport를 통해)에 대한 시간은 매우 유사합니다. – JBB

1

성능상의 이점은 실제로는 거의 없습니다. MyISAM 대 InnoDB를 벤치마킹해야한다. InnoDB 트랜잭션 엔진을 독점적으로 사용하면 다른 이점도 얻을 수 있습니다.

내 테스트에서 InnoDB는 일반적으로 MyISAM보다 약 150 % 더 많은 디스크 공간을 사용합니다. 이는 블록 구조와 인덱스 압축이 부족하기 때문입니다.

감당할 수 없다면 대신 InnoDB를 사용하십시오.

실제 질문에 답하는 한 : 테이블을 여러 개의 MyISAM 테이블로 분할하면 충돌시 필요한 복구 작업량이 훨씬 적습니다. 데이터가 큰 경우 다른 이유로 인해 좋은 아이디어 일 수 있습니다.

0

귀하의 코멘트 :

아니, 주요 문제는 테이블에 데이터 의 놀라 울 디스크를 많이 초기 수입이다. MyISAM 시간 : 12 분. InnoDB 시간 : 3+ 시간. 내 초기로드 이후에 업데이트가 존재하지 않습니다. 및 INSERT가 거의 없습니다.InnoDB의 실망스러운 로드 작업에 대한 해결책은 알려지지 않았습니다.

은 제약 조건과 인덱스를 삭제 한 다음로드를 수행 한 후이를 활성화/재구성하면 속도가 현저히 빨라질 수 있다고 제안합니다. 그것은 것들을 개선 했습니까?

0

이것은 실제로 테이블을 어떻게 사용 하느냐에 달려 있습니다. 쓰기가 무거운 경우 인덱스를 제거하여 복구 시간을 단축 할 수 있습니다. 읽기가 어려울 경우, 복제를 사용하여 테이블에 대한 모든 쓰기를 직렬화하여 충돌 후 읽기 사본의 복구 시간을 최소화하는 것이 좋습니다.

할 수있는 일은 테이블의 InnoDB 복사본에 쓰고 나서 MyISAM 복사본으로 복제하는 것이다. MyISAM의 성능 이점은 대부분 읽기 지향적입니다. 읽고 괜찮은 파워 컨디셔닝,

0

좋은 업을 쓰는 사이에 물론 복제를 사용

, 당신은 지연 시간이있을 것이다. 안정적이고 이중화 된 하드웨어에서 실행하십시오.

필자는 MyISAM 테이블이 쓰기 도중 충돌하는 것을 막을 수 없다는 것을 믿기 때문에 최선의 방법은 충돌 (및 쓰기) 발생을 줄이는 것이라고 생각합니다.

1

정상적으로 실행되면 손상되지 않아야합니다. 부패가 발생하는 경우, 나쁜 메모리, 나쁜 하드 드라이브, 나쁜 드라이브 컨트롤러, 또는 아마도 mysql 버그와 같은 것들을 봐야합니다.

모든 단계를 수행하려면 복제 슬레이브를 설정할 수 있습니다. 마스터가 죽으면 슬레이브에서 복제를 중지하고 새 마스터로 만듭니다. 이전 마스터의 데이터를 지우고 슬레이브로 설정하십시오. 사용자 다운 타임은 마스터가 죽었음을 감지하고 슬레이브를 들게하는 데 걸리는 시간으로 제한됩니다.

이렇게하면 제로 다운 타임 백업을 수행하는 좋은 방법입니다. 슬레이브 프로세스를 종료하고 슬레이브를 백업하십시오.

1

나는 innodb 코멘트에 동의하지만, 나는 당신의 MyISAM 문제에 대한 해결책을 제시 할 것이다.

손상을 방지하고 속도를 증가하는 MERGE tables

당신은 2 개 이상의 MyISAM 파일을 사용할 수 있습니다 사용하는 것이 좋은 방법. 하나는 일반적으로 자주 사용되지 않는 backup'd 오래된 데이터에 대한 것이고 다른 하나는 더 새로운 데이터입니다. 그러면 하드 디스크에 2 개의 FRM (MyISAM 테이블 파일)이 생기고 하나는 보호됩니다. 대개는 compress 이전 MyISAM 테이블을 읽으면 독점적으로 손상되지 않습니다.

이 기술은 일반적으로 큰 MyISAM 테이블의 속도를 높이기 위해 사용되지만 여기에도 적용 할 수 있습니다.

귀하의 질문에 도움이 되었기를 바랍니다. MyISAM이 충돌 방지 기능을 실제로 지원하지 않는다는 것을 알고는 있지만, 상당히 많은 보호 기능을 제공합니다.

관련 문제