이번 글은 온라인 mysql 옵티마이저의 잘못된 판단으로 인해 발생하는 느린 쿼리 이벤트에 대한 관련 정보와 최종 해결 방법을 주로 소개하고 있습니다.
머리말:
엄청나게 느린 쿼리와 요청 시간 초과 경보를 받았고, 메트릭을 통해 mysql 요청의 예외를 분석했습니다. cli —> show proceslist를 사용하여 느린 쿼리를 많이 보았습니다. 이 SQL은 이전에는 존재하지 않았으나 나중에 데이터 양의 증가로 인해 이러한 문제가 나타났습니다. 피드 테이블이 1억 개에 달하지만 피드 흐름 정보가 최근 핫하다는 특성을 갖고 있기 때문에 innodb_buffer_pool_size 비효율성으로 인해 잦은 IO가 발생하는 것은 아닙니다. 나중에 실행 계획 분석에 대해 자세히 설명한 후 mysql 쿼리 최적화 프로그램이 효율적이라고 생각되는 인덱스를 선택했습니다.
mysql 쿼리 최적화 프로그램은 대부분의 경우 신뢰할 수 있습니다. 그러나 SQL 언어에 여러 인덱스가 포함되어 있으면 최종 결과가 다소 주저되는 경우가 많습니다. mysql은 동일한 SQL에 대해 하나의 인덱스만 사용할 수 있으므로 어떤 인덱스를 선택해야 합니까? 데이터의 양이 적을 경우 MySQL 최적화 프로그램은 기본 키 인덱스를 게시하고 인덱스와 고유에 우선 순위를 부여합니다. 데이터 수준에 도달하면 쿼리 작업이 포함되었기 때문에 mysql 쿼리 최적화 프로그램은 기본 키를 사용할 가능성이 높습니다!
한 문장을 기억하세요. mysql 쿼리 최적화는 시간 비용 고려 사항이 아닌 검색 비용 고려 사항을 기반으로 합니다. 옵티마이저는 실제로 SQL을 실행하는 것이 아니라 기존 데이터 상태를 기준으로 비용을 계산합니다.
따라서 mysql 옵티마이저는 매번 최적화 결과를 얻을 수 없습니다. 비용을 정확하게 추정할 수 없으며, 각 지수를 실행하는 비용을 정확하게 얻으려면 실제로 한 번 실행해야 알 수 있으므로 비용 분석은 추정일 뿐이므로 오판이 발생합니다. .
여기서 이야기하는 테이블은 피드 정보 흐름 테이블이며, 피드 정보 흐름 테이블은 자주 액세스될 뿐만 아니라 많은 양의 데이터를 가지고 있다는 것을 알고 있습니다. 하지만 이 테이블의 데이터 구조는 매우 간단하고 인덱스도 간단합니다. 총 인덱스는 두 개뿐입니다. 하나는 기본 키 인덱스이고 다른 하나는 고유 키 인덱스입니다.
다음과 같이 캐시가 충분하고 여러 가지 이유로 데이터베이스 및 테이블 파티셔닝을 수행할 시간이 없기 때문에 이 테이블의 크기가 1억 레벨에 도달했습니다.
문제는 데이터 크기가 1억 미만일 때 mysql 옵티마이저가 인덱스 인덱스를 사용하도록 선택한다는 것입니다. 쿼리 최적화 프로그램은 기본 키 인덱스를 사용하도록 선택합니다. 이로 인해 발생하는 문제는 쿼리 속도가 너무 느리다는 것입니다.
정상적인 상황입니다.
mysql> explain SELECT * FROM `feed` WHERE user_id IN (116537309,116709093,116709377) AND cid IN (1001,1005,1054,1092,1093,1095) AND id <= 128384713 ORDER BY id DESC LIMIT 0, 11 \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: feed partitions: NULL type: range possible_keys: PRIMARY,feed_user_target key: feed_user_target key_len: 6 ref: NULL rows: 18 filtered: 50.00 Extra: Using where; Using index; Using filesort 1 row in set, 1 warning (0.00 sec)
동일한 SQL 문에 대해 데이터 양이 크게 변경된 후 mysql 쿼리 최적화 프로그램 Index 선택도 바뀌었습니다.
mysql> explain SELECT * FROM `feed` WHERE user_id IN (116537309,116709093,116709377) AND cid IN (1001,1005,1054,1092,1093,1095) AND id <= 128384713 ORDER BY id DESC LIMIT 0, 11 \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: feed type: range possible_keys: PRIMARY,feed_user_target key: PRIMARY key_len: 4 ref: NULL rows: 11873197 Extra: Using where 1 row in set (0.00 sec)
그런 다음 해결책은 강제 인덱스를 사용하여 쿼리 최적화 프로그램이 우리가 제공한 인덱스를 사용하도록 하는 것입니다. 이것은 Python 개발 환경입니다. 일반적인 Python ORM에는 강제 인덱스, 인덱스 무시 및 사용자 인덱스 매개변수가 있습니다.
explain SELECT * FROM `feed` force index (feed_user_target) WHERE user_id IN (116537309,116709093,116709377) ...
그러면 이 문제를 어떻게 방지해야 할까요? 데이터 증가로 인해 mysql 옵티마이저가 비효율적인 인덱스를 선택하게 된 걸까요?
이 문제에 대해 여러 공장의 DBA에게 조언을 구했는데, 얻은 답변은 우리 방법과 같았습니다. 문제는 나중에 느린 쿼리를 통해서만 발견할 수 있으며, 그런 다음 SQL 문에 강제 인덱스를 지정하여 인덱스 문제를 해결합니다. 또한 이러한 종류의 문제는 온라인으로 전환되는 시스템의 초기 단계에서는 피할 수 있지만 초기 단계에서는 비즈니스 개발자가 DBA의 검토 작업에 협력하는 경우가 많지만 후반 단계에서는 문제를 방지하기 위해 또는 문제가 없다고 생각하면 MySQL 쿼리 사고가 발생합니다.

MySQL과 Sqlite의 주요 차이점은 설계 개념 및 사용 시나리오입니다. 1. MySQL은 대규모 응용 프로그램 및 엔터프라이즈 수준의 솔루션에 적합하며 고성능 및 동시성을 지원합니다. 2. SQLITE는 모바일 애플리케이션 및 데스크탑 소프트웨어에 적합하며 가볍고 내부질이 쉽습니다.

MySQL의 인덱스는 데이터 검색 속도를 높이는 데 사용되는 데이터베이스 테이블에서 하나 이상의 열의 주문 구조입니다. 1) 인덱스는 스캔 한 데이터의 양을 줄임으로써 쿼리 속도를 향상시킵니다. 2) B-Tree Index는 균형 잡힌 트리 구조를 사용하여 범위 쿼리 및 정렬에 적합합니다. 3) CreateIndex 문을 사용하여 CreateIndexIdx_customer_idonorders (customer_id)와 같은 인덱스를 작성하십시오. 4) Composite Indexes는 CreateIndexIdx_customer_orderOders (Customer_id, Order_Date)와 같은 다중 열 쿼리를 최적화 할 수 있습니다. 5) 설명을 사용하여 쿼리 계획을 분석하고 피하십시오

MySQL에서 트랜잭션을 사용하면 데이터 일관성이 보장됩니다. 1) STARTTRANSACTION을 통해 트랜잭션을 시작한 다음 SQL 작업을 실행하고 커밋 또는 롤백으로 제출하십시오. 2) SavePoint를 사용하여 부분 롤백을 허용하는 저장 지점을 설정하십시오. 3) 성능 최적화 제안에는 트랜잭션 시간 단축, 대규모 쿼리 방지 및 격리 수준을 합리적으로 사용하는 것이 포함됩니다.

MySQL 대신 PostgreSQL을 선택한 시나리오에는 다음이 포함됩니다. 1) 복잡한 쿼리 및 고급 SQL 기능, 2) 엄격한 데이터 무결성 및 산 준수, 3) 고급 공간 기능이 필요하며 4) 큰 데이터 세트를 처리 할 때 고성능이 필요합니다. PostgreSQL은 이러한 측면에서 잘 수행되며 복잡한 데이터 처리 및 높은 데이터 무결성이 필요한 프로젝트에 적합합니다.

MySQL 데이터베이스의 보안은 다음 조치를 통해 달성 할 수 있습니다. 1. 사용자 권한 관리 : CreateUser 및 Grant 명령을 통한 액세스 권한을 엄격히 제어합니다. 2. 암호화 된 전송 : 데이터 전송 보안을 보장하기 위해 SSL/TLS를 구성합니다. 3. 데이터베이스 백업 및 복구 : MySQLDump 또는 MySQLPump를 사용하여 정기적으로 백업 데이터를 사용하십시오. 4. 고급 보안 정책 : 방화벽을 사용하여 액세스를 제한하고 감사 로깅 작업을 가능하게합니다. 5. 성능 최적화 및 모범 사례 : 인덱싱 및 쿼리 최적화 및 정기 유지 보수를 통한 안전 및 성능을 모두 고려하십시오.

MySQL 성능을 효과적으로 모니터링하는 방법은 무엇입니까? Mysqladmin, Showglobalstatus, Perconamonitoring and Management (PMM) 및 MySQL Enterprisemonitor와 같은 도구를 사용하십시오. 1. MySQLADMIN을 사용하여 연결 수를보십시오. 2. showglobalstatus를 사용하여 쿼리 번호를보십시오. 3.pmm은 자세한 성능 데이터 및 그래픽 인터페이스를 제공합니다. 4. MySQLENTERPRISOMITOR는 풍부한 모니터링 기능 및 경보 메커니즘을 제공합니다.

MySQL과 SqlServer의 차이점은 1) MySQL은 오픈 소스이며 웹 및 임베디드 시스템에 적합합니다. 2) SQLServer는 Microsoft의 상용 제품이며 엔터프라이즈 수준 애플리케이션에 적합합니다. 스토리지 엔진의 두 가지, 성능 최적화 및 응용 시나리오에는 상당한 차이가 있습니다. 선택할 때는 프로젝트 규모와 향후 확장 성을 고려해야합니다.

고 가용성, 고급 보안 및 우수한 통합이 필요한 엔터프라이즈 수준의 응용 프로그램 시나리오에서는 MySQL 대신 SQLServer를 선택해야합니다. 1) SQLServer는 고 가용성 및 고급 보안과 같은 엔터프라이즈 수준의 기능을 제공합니다. 2) VisualStudio 및 Powerbi와 같은 Microsoft Ecosystems와 밀접하게 통합되어 있습니다. 3) SQLSERVER는 성능 최적화에서 우수한 성능을 발휘하며 메모리 최적화 된 테이블 및 열 스토리지 인덱스를 지원합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

Dreamweaver Mac版
시각적 웹 개발 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.
