SQLite 성능 최적화 사례 공유
대략적인 응용 장면은 다음과 같다.
매번 프로그램이 시작될 때마다 서버에서 일부 데이터를 추출하여 로컬 데이터베이스 두 테이블을 동기화하여 업데이트합니다. 존재하지 않으면 쓰고 존재하면 필드를 업데이트합니다.데이터가 적을 때는 몇 십 개, 많으면 천 개가 넘는다.
캐시된 데이터에 비동기적인 읽기와 쓰기가 존재할 수 있기 때문에 백그라운드 동기화 대기열을 만들었다. 모든 캐시 데이터베이스 작업은 이 대기열에 있다. 그리고 나는 데이터베이스를 쓰는 관건적인 코드의 실행 시간을 감시했다. 천 개의 데이터가 데이터베이스에 업데이트되는 데 30초가 걸린다. 디스크는 1.5M/s에 기록되어 있다. 비록 카드의 메인 라인이 없지만 이 소모는 백그라운드에서도 용납할 수 없다.
핵심적인 데이터베이스 조작은 대략 이렇다
for 1000 : {
Select -> Update Or Insert
Select -> Update Or Insert
}
두 개의 표가 관련되어 있기 때문에 두 번은 있을 것이다. 테스트를 통해 Select는 한 번에 소식이 거의 없지만 Update나 Insert([FMdatabaseQueue execute Update:])는 소모가 크다. 디스크에 쓸 수 있기 때문에 모든 SQL 문장을 연결할 수 있는지 생각하고 마지막으로 한 번만 생각하기 때문이다.그리고 나서 SQLite에 트랜잭션이 있잖아요. 그래서 FMDB를 이용한 트랜잭션을 시도했어요. 순환이 시작되기 전에 [db begin Transaction], 순환이 끝나면 [db commit], 포장하면 돼요.트랜잭션 증가 이후의 대략적인 논리:
beginTransaction
for 1000 : {
Select -> Update Or Insert
Select -> Update Or Insert
}
commit
테스트 효과가 매우 좋아서 전체 소모 시간이 30초에서 2.8초 정도로 줄어들었고 단지 두 줄의 코드만 증가했다.요약:
밟은 구덩이, 지나간 고비, 모두 이후의 경험이다
비록 사무를 교묘하게 이용하여 성능을 향상시켰지만 이렇게 하는 것은 사실 안전하지 않다. 다행히도 소속 장면에서 이 부분의 데이터에 대한 절대적인 일치 요구가 그리 높지 않다.
시뮬레이터와 팩시밀리는 때때로 테스트가 같은 문제를 재현할 수 없다. 소속 구조, CPU, 하드디스크가 모두 다르기 때문에 성능 테스트는 팩시밀리를 기준으로 하는 것이 가장 좋다.이 문제는 테스트할 때 시뮬레이터에 문제가 많았는데 하드디스크가 실제 컴퓨터보다 읽기와 쓰기 속도가 높기 때문에 많은 문제를 피했고 테스트할 때도 발견하지 못했다.
데이터베이스 디자인을 할 때 많이 고려하고 앞으로 어떻게 확장할지, 어떻게 업그레이드할지, 읽고 쓸 때 성능이 어떤지 많이 생각해야 한다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
SQLite 데이터베이스 설치 및 기본 운영 설명서대부분의 경우 - SQLite의 바이너리 파일이 존재하는지 확인하면 데이터베이스를 만들고 연결하며 사용할 수 있다.내장형 데이터베이스 항목이나 솔루션을 찾고 있다면 SQLite는 매우 고려할 만합니다. SQLite ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.