programing

Maria에서 느린 업데이트, 삭제 및 쿼리 삽입DB

goodjava 2023. 1. 4. 20:04

Maria에서 느린 업데이트, 삭제 및 쿼리 삽입DB

서버가 Ubuntu 16에서 Ubuntu 20으로 MariaDB로 업데이트 되었습니다.안타깝게도 웹사이트의 로딩 시간이 느려졌습니다.일반적으로 MariaDB는 Mysql보다 빠릅니다.웹 사이트의 업데이트 명령어는 7초 정도 걸릴 수 있습니다.그러나 myphpadmin을 통해 직접 데이터베이스에 업데이트 명령을 입력하면 0.0005ms밖에 걸리지 않습니다.

MariaDB는 업데이트 명령어가 자주 발생하는 데 문제가 있는 것 같습니다.이것은 mysql에서는 문제가 되지 않았습니다.다음은 질문의 예입니다.

UPDATE LOW_PRIORITY users
SET user_video_count = user_video_count + 1
WHERE user_id = 12345

데이터베이스 형식은 MyISAM 입니다.

이유가 뭔지 전혀 모르겠어요.그러니?

정말 감사합니다.

도 모른다.SELECTusers주의: InnoDB는 이 문제를 겪지 않습니다.

MyISAM할 때 반드시 테이블이 잠기나요?UPDATE,INSERT , 「」DELETE (또...)ALTERDDL(DDL)입니다. 글쓰기가 SELECTs자물쇠는 놀라울 정도로 오랫동안 캐스케이드 될 수 있습니다.

MariaDB든 MySQL이든 진정한 해결책은 InnoDB로 전환하는 것입니다.

이것이 "좋아요" 또는 "보기"의 대량 카운트인 경우, 부분적인 해결책은 이러한 카운터를 별도의 병렬 테이블에 배치하는 것입니다.이렇게 하면 메인 테이블의 다른 액션과 경쟁하는 단순하고 빠른 업데이트를 피할 수 있습니다.트래픽이 매우 많은 영역에서는 이러한 증분을 수집하여 일괄 적용하는 것이 보증됩니다.당신의 볼륨에는 그런 급진적인 솔루션이 필요하지 않다고 생각합니다.

MySQL은 MyISAM을 거의 제거했습니다.MariaDB는 몇 년 안에 선례를 따를지도 모른다.

이 문제에 대처하려면:

myphpadmin의 동일한 쿼리는 매우 빠릅니다.

문제는 어떻게 운영하느냐가 아니라 동시에 어떤 일이 일어나느냐에 있습니다.

)LOW PRIORITYMyISAM 고유의 크러지로서 가끔 동작하는 경우가 있습니다.

MyISAM은 "테이블 잠금", InnoDB는 "행 잠금"을 수행합니다.따라서 Innodb는 테이블에서 많은 "동시" 작업을 수행할 수 있지만 MyISAM은 쓰기가 발생하는 즉시 직렬화됩니다.

기타 (이제 InnoDB에 초점을 맞춥니다.

관련된 다른 것들.

개일 경우UPDATEs같은 을 동시에 변경하려고 합니다(행 잠금으로 인해).

일이 너무 많으면 지연이 속출할 수 있습니다.20개의 접속이 동시에 액티브하게 동작하고 있는 경우는, 각각이 서로의 속도를 늦추고 있습니다.각 연결에는 공평한 몫이 주어지지만, 이는 모두 속도가 느려진다는 것을 의미합니다.

SHOW PROCESSLISTSleep"Sleep"이 가동되는 합니다.(시스템 스레드를 제외한) 가장 높은 "시간"을 가진 프로세스가 분쟁의 원인이 될 수 있습니다.

느린 통나무는 더 깊이 잠수하는데 도움을 줄 수 있다.틀어놓습니다.long_query_time이벤트가 일어날 이벤트'가 일어날 때까지 기다립니다. 저는 ★★★★★★★★★★★★★★★★★★★.pt-query-digest (오류)mydumpslow -s t를 알아냅니다이치 노력하면, 「알 수 「 쿼리 쿼리」등)도 있을 수 있습니다.'이러다' (이러다)UPDATE ... WHERE id=constant)long_query_time이는 예기치 않게 행을 잠그고 있는 쿼리 및/또는 쿼리가 너무 많다는 것을 나타냅니다.(주의: 쿼리의 "타임 스탬프"는 쿼리가 종료된 시점입니다; 빼기Query_time시작하도록 하겠습니다.)저속 로그

innodb_flush_log_at_trx_commit = 2아시겠지만, 이 방법은 많은 단일 패킷 트랜잭션을 신속하게 수행할 때 좋은 해결책입니다.그 수정에 대해 빈도가 너무 커지면, 상기의 코멘트가 필요하게 될 수 있습니다.

=2와 =0의 성능 차이는 크지 않습니다.

★★★★★★에 대해서innodb_flush_log_at_timeoutLIKE '를 입력해 "SHOW GLOBAL STATUS LIKE "Binlog %commits"처럼"

★★★★★★에 대해서innodb_lock_wait_timeout그걸 、 움움움움움움 。이 타임아웃으로 인해 쿼리 중 하나가 중단되면 발생한 것을 기록하고 트랜잭션을 재시도해야 합니다.

것 ?autocommit = ON시적 트트 ?용 용? 용? ???을 사용법트랜잭션을 사용하면 일부 I/O를 방지하기 위해 여러 쿼리를 인위적으로 일괄 처리하는 것과 같이 성능에 도움이 될 수 있습니다.단점은 다른 접속과 경합할 가능성이 높아진다는 것입니다.그래도 항상 오류를 확인하고 '트랜잭션'을 다시 실행한다면 모든 것이 정상일 것입니다.

innodb_commit_log_at_trx_commit

이 설정이 "1"인 경우(아마도 원래 설정일 것입니다), 각 업데이트는 데이터 무결성을 보장하기 위해 Disk에 추가 쓰기를 수행했습니다.디스크가 HDD(SDD가 아님)인 경우, 각 업데이트에 약 10ms가 추가되므로 최대 업데이트 수는 초당 약 100개입니다.몇 가지 방법이 있습니다.

  • innodb_flush_log_at_trx_commit = 0 or 2이치노
  • 여러 업데이트를 하나의 트랜잭션으로 인위적으로 결합하여 10ms를 여러 쿼리에 분산시킵니다.
  • 작업 내용 및/또는 조작하는 행에 따라 여러 업데이트를 명시적으로 조합합니다.(사용량이 많은 시스템에서는 다른 서버 및/또는 다른 테이블이 포함될 수 있습니다.)
  • 카운터를 다른 테이블로 이동(위 참조) - 메인 테이블에서 더 많은 시간이 걸리는 작업의 간섭을 허용합니다.(명확한 예는 듣지 못했지만, slowlog에 의해 지적되었을 가능성이 있습니다).
  • SSD 드라이브로 전환 - 업데이트 용량의 약 10배 증가.

나는 소셜 미디어 대기업들이 위의 모든 것을 한다고 의심한다.

MariaDB를 사용하는 경우 EverSQL과 같은 도구를 사용하여 누락된 인덱스를 찾거나 중복 인덱스를 검색할 수 있습니다(예: 실제로 필요하지 않은 user_video_count에 인덱스가 있습니다).

우선 저를 도와주신 모든 분들께 감사드립니다.사람들이 소중한 시간을 투자하려고 하는 것에 대해 정말 감사합니다.

느린 업데이트, 삽입 및 삭제로 인한 문제를 어떻게 해결했는지 알려드립니다.

my.cnf 파일에 다음 값을 추가했습니다.

innodb_flush_log_at_trx_commit = 2

mysql 서버를 재기동한 후 서버의 로드가 갑자기 감소하여 업데이트, 삽입 및 삭제 쿼리도 로드 시 0.2222~0.91922초에서 0.000013으로 떨어졌습니다.Myisam과 Mysql의 경우와 마찬가지로 인덱스로 간단하게 갱신할 수 있는 방법이 있습니다.

삽입 또는 업데이트 명령을 자주 받는 테이블은 모두 INNODB로, 선택 항목이 많은 테이블은 ARIA로 설정했습니다.

우리는 금전 거래를 취급하지 않기 때문에 마지막 몇 초를 잃어도 문제 없습니다.

innodb_flush_log_at_trx_commit = 2 

더 나아가다.마지막 30초를 실패로 잃어도 견딜 수 있어요.

다음과 같이 설정했습니다.

innodb_flush_log_at_timeout = 30

현재 테스트 중입니다.

innodb_flush_log_at_trx_commit = 0

하지만 아직까진, 제가 보기엔

innodb_flush_log_at_timeout = 30
innodb_flush_log_at_trx_commit = 0

대신

innodb_flush_log_at_timeout = 1 (default)
innodb_flush_log_at_trx_commit = 2

주요 목표는 다음과 같습니다.

innodb_flush_log_at_trx_commit = 2

or

innodb_flush_log_at_trx_commit = 0

왜 그런지 아는 사람?

innodb_flush_log_at_timeout = 30
innodb_flush_log_at_trx_commit = 0

단순한 속도보다 빠르지 않다

innodb_flush_log_at_trx_commit = 2

?

또, 많은 Web 사이트가 1초 이상 손실되는 것을 개의치 않으면, 속도가 큰폭으로 향상될 가능성이 있기 때문에, 왜 이 설정이 인기가 없는지도 이해할 수 없습니다.

정말 감사합니다.

언급URL : https://stackoverflow.com/questions/71220908/slow-update-delete-and-insert-queries-under-mariadb