SELECT count(*) c FROM full_view WHERE verified > (DATE (NOW()) - INTERVAL 30 DAY)
쿼리를 실행하면 분할 초가 걸리지 만 비교 연산자를 전환하면 주변에 많은 시간이 걸립니다. 이제 첫 번째 방법은 count = 0이고 두 번째 방법은 count = 120000이지만, 단지 마이크로 초가 걸린 전체 테이블을 계산하면됩니다.MySQL - COUNT는 "보다 큼"이 빠르지 만 "미만"은 영원히 걸리는 이유는 무엇입니까?
하지만 쿼리가 끝나면 이후에 매우 빠르게 실행되기 때문에 펑키 한 무언가가 있습니다. MySQL은 쿼리 또는 뭔가를 캐싱하고 있습니까? 음, 웹 사이트가 멈추지 않도록 캐시에 의존하고 싶지 않습니다.
이 말은 무의미한 것처럼 보입니다. 특정 날짜보다 빠르게 모든 항목을 계산할 수 있다면 왜 그 반대 수를 계산하는 데 더 오래 걸릴까요? 어느 쪽이든 전체 테이블을 살펴 봐야합니까? 반환해야 할 모든 것이 숫자이므로 대역폭이 문제가되지 않아야합니다.
쿼리에 대한 설명 :
1, 'SIMPLE', 'b', 'range', 'updated,verified_index', 'updated', '3', '', 28, 'Using where'`
1, 'SIMPLE', 'l', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'xyz_main.b.loc_id', 1, 'Using index'
1, 'SIMPLE', 'f', 'ALL', '', '', '', '', 2214, ''
편집 :
Handler_read_rnd_next :
나는 쿼리를 실행할 때이 어떤 관심이있을 수 있습니다, 나는이 정보를 발견
- 254436689 (whe N 이하
Key_read_requests)보다 대
Handler_read_key보다 : 104,303 vs 1
보기를 바이 패스하고 주 테이블에서 직접 쿼리를 실행하면 느려질 필요가 없습니다. 속도를 높이려면 어떻게해야합니까? 뷰는 다음과 같이 본질적 :이 해결
SELECT x, y, z, verified FROM table1 LEFT JOIN table2 on tab2_ID = table2.ID LEFT JOIN table3 on tab3_ID = table3.ID
: 프랭키가 올바른 방향으로 내을했다. 두 번째로 조인 된 테이블 (회사 테이블)은 회사의 전체 텍스트 이름을 통해 조인되었습니다. 나는 최근에 그 테이블에 정수 키를 추가하기로 결정했습니다. 이름 열은 색인이 생성되어야한다고 생각 했었지만 나는 그것을 망쳤습니다. 어쨌든 나는 모든 것을 재구성했다. 주 테이블의 외래 키를 전체 회사 이름이 아닌 회사 테이블의 정수 ID와 일치하도록 변환했습니다. 각 테이블의 해당 열을 다시 인덱싱 한 다음 새 조인 포인트를 반영하도록 뷰를 업데이트했습니다. 이제는 양방향으로 즉시 실행됩니다. :) 그래서 정수형 키가 핵심이라고 생각합니다. 문제는 사라졌지만 여전히 원래 질문이 실제로 해결 된 것 같지 않습니다.
도움 주셔서 감사합니다.
'full_view'는보기라고 가정합니다. 그 정의는 무엇입니까? –
'계획 설명'에서 무엇을 말합니까? –
full_view에는 확인 된 열이있는 주 테이블이 두 개의 다른 테이블에 조인 된 채로 남아 있습니다. 기본 테이블은 사람들이고 다른 두 테이블은 위치와 회사 정보를 결합합니다. 그것은 꽤 똑 바른 앞으로입니다. – Moss