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 초 동안 조 회 했 습 니 다.

총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기