질문에 따르면 SQL 문에는 조건이 너무 많지만 인덱스는 하나만 사용할 수 있습니다. 안타깝지 않습니까? WHERE 조건은 다음과 같습니다.
(
(
(
(`from_uid` = 5017446 AND `from_type` = 1 AND `to_uid` = 52494 AND `to_type` = 3)
또는
(`from_uid` = 52494 AND `from_type` = 3 AND `to_uid` = 5017446 AND `to_type` = 1)
)
AND `유형` = 2 AND `qa_id` = 0
)
또는 ------------------ 이 OR 여기 -------------------------- -- ------
(`type` = 3 AND `to_uid` = 52494 AND `to_type` = 3 AND `from_uid` = 5017446 AND `from_type` = 1
AND `모듈` IN ('community.doctor:appointment:notice' ,
'커뮤니티.의사:이송.치료',
'community.doctor:이전.치료.지불',
'community.doctor:weiyi.guahao.to.user',
'community.doctor:weiyi.prescription.to.patient',
'community.doctor:user.buy.prescription')
)
)
AND `상태` = 1
AND `record_global_id` <
전체 WHERE는 두 부분으로 나눌 수 있습니다. 아이디어는 UNION입니다. 유용하다면 채택해 주시기 바랍니다.
변환 후 SQL:
(
선택하다
`레코드_글로벌_ID`,
'유형',
'마크',
`from_uid`,
'from_type',
`to_uid`,
`to_type`,
`보내기_방법`,
'액션',
'모듈',
`보내기_시간`,
'내용'
에서
`im_data_record`
어디
(
(`from_uid` = 5017446 AND `from_type` = 1 AND `to_uid` = 52494 AND `to_type` = 3)
또는
(`from_uid` = 52494 AND `from_type` = 3 AND `to_uid` = 5017446 AND `to_type` = 1)
)
AND `유형` = 2 AND `qa_id` = 0 AND `상태` = 1
AND `record_global_id` <
)
노동 조합
(
선택하다
`레코드_글로벌_ID`,
'유형',
'마크',
`from_uid`,
'from_type',
`to_uid`,
`to_type`,
`보내기_방법`,
'액션',
'모듈',
`보내기_시간`,
'내용'
에서
`im_data_record`
어디
`type` = 3 AND `to_uid` = 52494 AND `to_type` = 3 AND `from_uid` = 5017446 AND `from_type` = 1
AND `모듈` IN ('community.doctor:appointment:notice' ,
'커뮤니티.의사:이송.치료',
'community.doctor:이전.치료.지불',
'community.doctor:weiyi.guahao.to.user',
'community.doctor:weiyi.prescription.to.patient',
'community.doctor:user.buy.prescription')
AND `상태` = 1 AND `record_global_id` <
)
ORDER BY `record_global_id` DESC
제한 0, 20;
만약 성공했다면 댓글로 실행 계획 스크린샷을 올려주실 수 있나요? 의심을 테스트하고 싶습니다. 감사합니다!
이유는
record_global_id
속성을 필터링 중인데 조건이 동일하지 않아 복합색인 뒤의 부분이 사용되지 않기 때문입니다.상태
열은 얼마나 차별화되나요? 인덱스(status, Record_global_id)
를 추가하고 시도해 보세요.여러 개의 SQL 문으로 분할하여 개별적으로 쿼리합니다.
질문에 따르면 SQL 문에는 조건이 너무 많지만 인덱스는 하나만 사용할 수 있습니다. 안타깝지 않습니까? WHERE 조건은 다음과 같습니다.
( ( ( (`from_uid` = 5017446 AND `from_type` = 1 AND `to_uid` = 52494 AND `to_type` = 3) 또는 (`from_uid` = 52494 AND `from_type` = 3 AND `to_uid` = 5017446 AND `to_type` = 1) ) AND `유형` = 2 AND `qa_id` = 0 ) 또는 ------------------ 이 OR 여기 -------------------------- -- ------ (`type` = 3 AND `to_uid` = 52494 AND `to_type` = 3 AND `from_uid` = 5017446 AND `from_type` = 1 AND `모듈` IN ('community.doctor:appointment:notice' , '커뮤니티.의사:이송.치료', 'community.doctor:이전.치료.지불', 'community.doctor:weiyi.guahao.to.user', 'community.doctor:weiyi.prescription.to.patient', 'community.doctor:user.buy.prescription') ) ) AND `상태` = 1 AND `record_global_id` <전체 WHERE는 두 부분으로 나눌 수 있습니다. 아이디어는 UNION입니다. 유용하다면 채택해 주시기 바랍니다.
변환 후 SQL:
( 선택하다 `레코드_글로벌_ID`, '유형', '마크', `from_uid`, 'from_type', `to_uid`, `to_type`, `보내기_방법`, '액션', '모듈', `보내기_시간`, '내용' 에서 `im_data_record` 어디 ( (`from_uid` = 5017446 AND `from_type` = 1 AND `to_uid` = 52494 AND `to_type` = 3) 또는 (`from_uid` = 52494 AND `from_type` = 3 AND `to_uid` = 5017446 AND `to_type` = 1) ) AND `유형` = 2 AND `qa_id` = 0 AND `상태` = 1 AND `record_global_id` < ) 노동 조합 ( 선택하다 `레코드_글로벌_ID`, '유형', '마크', `from_uid`, 'from_type', `to_uid`, `to_type`, `보내기_방법`, '액션', '모듈', `보내기_시간`, '내용' 에서 `im_data_record` 어디 `type` = 3 AND `to_uid` = 52494 AND `to_type` = 3 AND `from_uid` = 5017446 AND `from_type` = 1 AND `모듈` IN ('community.doctor:appointment:notice' , '커뮤니티.의사:이송.치료', 'community.doctor:이전.치료.지불', 'community.doctor:weiyi.guahao.to.user', 'community.doctor:weiyi.prescription.to.patient', 'community.doctor:user.buy.prescription') AND `상태` = 1 AND `record_global_id` < ) ORDER BY `record_global_id` DESC 제한 0, 20;만약 성공했다면 댓글로 실행 계획 스크린샷을 올려주실 수 있나요? 의심을 테스트하고 싶습니다. 감사합니다!
创建复合索引(
from_uid
,to_uid
,from_type
,to_type
,type
>,상태
,record_global_id
)修改sql为union如下:
如果根据from_uid,to_uid,from_type,to_type,type,status筛选的结果集较少的话,可union子查询中不사용加AND
record_global_id
< 5407938 ORDER BYrecord_global_id
DESC LIMIT 0 , 20