MySQL 에서 필드 문자 집합 에 따라 색인 이 명중 되 지 않 는 해결 방법
색인 은 특정한 열 에 특정한 값 이 있 는 줄 을 신속하게 찾 는 데 사 용 됩 니 다.색인 을 사용 하지 않 습 니 다.MySQL 은 첫 번 째 기록 부터 전체 표를 읽 어야 합 니 다.관련 줄 을 찾 을 때 까지 표 가 클 수록 데 이 터 를 조회 하 는 데 걸 리 는 시간 이 많 습 니 다.표 에서 조회 한 열 에 색인 이 있 으 면 MySQL 은 모든 데 이 터 를 보지 않 고 한 위치 에 빠르게 도착 하여 데이터 파일 을 검색 할 수 있 습 니 다.그러면 많은 시간 을 절약 할 수 있 을 것 이다.
예 를 들 어 person 표 가 있 는데 그 중에서 2W 개의 기록 이 있 고 2W 개인의 정 보 를 기록 하고 있다.하나의 Phone 필드 에 모든 사람의 전화 번 호 를 기록 하고 있 습 니 다.지금 은 전화번호 가 xxxx 인 사람의 정 보 를 조회 하고 싶 습 니 다.
색인 이 없 으 면 이 정 보 를 찾 을 때 까지 표 의 첫 번 째 기록 에서 한 줄 한 줄 아래로 옮 겨 다 닙 니 다.
색인 이 있 으 면 이 Phone 필드 를 일정한 방법 으로 저장 하여 이 필드 의 정 보 를 조회 할 때 2W 개의 데 이 터 를 옮 겨 다 니 지 않 고 해당 하 는 데 이 터 를 신속하게 찾 을 수 있 도록 합 니 다.그 중에서 MySQL 의 색인 저장 유형 은 두 가지 가 있 는데 그것 이 바로 BTREE,HASH 이다.즉,트 리 나 Hash 값 으로 이 필드 를 저장 하 는 것 입 니 다.그 중에서 어떻게 찾 았 는 지 알 기 위해 서 는 알고리즘 에 대한 지식 이 필요 합 니 다.우 리 는 지금 색인 의 역할,기능 이 무엇 인지 만 알 면 된다.
머리말
오늘 sql 을 썼 는데 그 중에서 관련 된 표 의 데이터 양 이 많 지 않 고 50w 정도 차이 가 나 지 않 았 습 니 다.조회 결과 8s 를 사 용 했 습 니 다.이것 은 테스트 복 에 있 는 데이터 일 뿐 이 니 정식 복 에 올 려 놓 으 면 틀림없이 실행 하 자마자 끊 을 것 이다.
SELECT
Orders. NO,
GuidNo,
Orders.CreateTime,
sum(OrderItem.Quantity) AS Quantity,
Brand. NAME AS BrandName,
member.Mobile,
Street AS deliveryaddress,
Area
FROM
Orders
INNER JOIN OrderItem ON Orders.GuidNo = OrderItem.OrderGuidNo
INNER JOIN Brand ON Brand.Id = Orders.BrandId
INNER JOIN member ON member.Id = 13
INNER JOIN memberaddress ON member.Id = memberaddress.MemberId
WHERE
orders.GuidNo IN (
SELECT
orderpayment.OrderGuidNo
FROM
paymentrecord
LEFT JOIN orderpayment ON paymentrecord.`No` = orderpayment.PaymentNo
WHERE
paymentrecord.PaymentMethod = 'MemberCard'
AND paymentrecord.Payer = 13
)
GROUP BY
GuidNo;
그리고 EXPLAIN 으로 분석 해 보 니 Orders 표 에 명중 색인 이 없 는 것 으로 나 타 났 으 나 Orders 의 GuidNo 에 색인 이 설정 되 어 있 지만 명중 할 수 없 었 다.해결 과정
그리고 나 서 나 는 위의 문장 을 두 문장 으로 나 누 었 다.먼저 sql 문 구 를 수정 합 니 다.하위 조회 데 이 터 를 sql 에 직접 썼 고 조 회 는 0.12s 를 사 용 했 습 니 다.
SELECT
Orders. NO,
GuidNo,
Orders.CreateTime,
sum(OrderItem.Quantity) AS Quantity,
Brand. NAME AS BrandName,
member.Mobile,
Street AS deliveryaddress,
Area
FROM
Orders
INNER JOIN OrderItem ON Orders.GuidNo = OrderItem.OrderGuidNo
INNER JOIN Brand ON Brand.Id = Orders.BrandId
INNER JOIN member ON member.Id = 13
INNER JOIN memberaddress ON member.Id = memberaddress.MemberId
WHERE
orders.GuidNo IN (
'0A499C5B1A82B6322AE99D107D4DA7B8',
'18A5EE6B1D4E9D76B6346D2F6B836442',
'327A5AE2BACEA714F8B907865F084503',
'B42B085E794BA14516CE21C13CF38187',
'FBC978E1602ED342E5567168E73F0602'
)
GROUP BY
GuidNo
두 번 째:하위 검색 을 단독으로 실행 하 는 Sql 도 0.1s 밖 에 사용 하지 않 았 습 니 다.
SELECT
orderpayment.OrderGuidNo
FROM
paymentrecord
LEFT JOIN orderpayment ON paymentrecord.`No` = orderpayment.PaymentNo
WHERE
paymentrecord.PaymentMethod = 'MemberCard'
AND paymentrecord.Payer = 13
이런 문 제 는 분명 하 다.틀림없이 하위 조회 와 아버지 조회 와 관련 된 문제 일 것 이다.하위 조회 가 단독 적 으로 빠 르 기 때문에 아버지 조회 용 하위 조회 데 이 터 를 직접 찾 을 때 도 빠 르 고 그들 둘 이 결합 할 때 매우 느리다.대체로 이 두 개의 관련 필드 인 OrderGuid No 에 문 제 를 잠 글 수 있 습 니 다.마지막 으로 orderpayment 표 와 Orders 표 문자 집합 이 다른 것 을 발견 했다.표 의 문자 집합 은:utf 8 입 니 다.general_ci,하 나 는:utf8mb 4general_ci。(찾 지 않 으 면 모 르 겠 습 니 다.데이터베이스 에 있 는 많은 표 의 문자 집합 이 다 릅 니 다)
orderpayment 표 의 문자 집합 과 표 의 OrderGuid No 문자 집합 을 수정 합 니 다:utf 8general_ci
ALTER TABLE orderpayment DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; //
ALTER TABLE orderpayment CHANGE OrderGuidNo OrderGuidNo VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci; //
그리고 EXPLAIN 으로 분석 해 보면 모두 색인 을 사용 한 것 을 볼 수 있다.그리고 실행 해서 0.112 초 동안 조 회 했 습 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
mongoDB에서 투영을 사용하여'추가'필드를 제거하는 작업 과정실제 개발 과정에서 개발자의 포지셔닝 문제에 편리하도록 여러 개의 추가 필드가 존재한다.예를 들어createdAt, updatedAt 필드를 추가하여 데이터의 생성과 변경 시간을 확인합니다.클라이언트에게는 존재를 알...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.