MySQL 결정론적 함수 결과 캐시를 지우는 방법은 무엇입니까?
Latitude당 가장 가까운 위치를 확인하기 위해 실시간 Geo 데이터와 자주 비교해야 하는 대용량 Geo 데이터베이스가 있습니다.경도.위치 테이블에는 여러 행이 있지만 새 레코드가 추가되는 경우는 거의 없습니다.수백만 개의 실시간 데이터에 대해 가장 가까운 위치를 결정하는 것은 직사각형 거리 비교 알고리듬을 구현한 후에도 매우 느린 쿼리로 고통스럽게 비용을 지불합니다(Haversine이 실제로 비교한 것보다).
저는 이 비교를 정적 결과와 함께 실질적인 성능 향상을 가져올 수 있는 결정론적 함수로 변환하고자 합니다.
그러나 MySQL이 매주 이 결정론적 결과 캐시를 재설정/재구축하기를 원합니다.예를 들어, MySQL이 Latitude에 대해 동일한 결과를 반환하기를 원합니다.경도 쌍이 내 위치 테이블과 비교되지만 7일 동안입니다.7일 후에는 테이블에 새 위치를 추가할 가능성이 높으며, MySQL이 가능한 한 MySQL 서버를 다시 시작하지 않고 새 행이 테이블에 추가된 것을 고려하여 결정론적 함수 결과 캐시를 재구성하기를 원합니다.
참고: MariaDB 호환 솔루션은 매우 유용합니다 :)
수정:MySQL에서 그 용어를 사용하는 것을 용서해 주세요.제가 이해할 수 있는 한, 모든 입력이 동일한 결정론적 함수에 대한 결과는 변하지 않습니다. 이것은 MySQL이 실제로 함수 내부의 명령을 실행하거나 처리하는 경향이 없으며, 오히려 동일한 입력 값 집합에 대해 이전에 계산된 값을 반환하므로, 확실히 값을 캐시합니다.어딘가에서(어디서인지는 모르지만), 따라서 목록을 통해 위를 보는 것과 같은 행동을 합니다.여기 캐시로 옵티마이저를 오버로드한 것 같습니다 :(
기술적 설명을 위해 편집 ========
Table: data (around 4.5 Bl records)
ID BIGINT(20) PK AI
Terminal BIGINT(20) NOT NULL <= Foreign key
Latitude FLOAT (8, 5) NULL (indexed)
Longitude FLOAT (8, 5) NULL (indexed)
Location <= Foreign key
Table: location (around 10k records)
ID BIGINT(20) PK AI
Name VARCHAR(250) NOT NULL UNIQUE
Latitude FLOAT (8, 5) NOT NULL (indexed)
Longitude FLOAT (8, 5) NOT NULL (indexed)
'데이터' 테이블의 수신 데이터는 실시간으로 초당 약 1500개의 데이터(초당 무한 반복되는 프로세스가 있음)입니다.데이터의 약 85%가 좌표를 포함하고 있으며 실시간으로 스트림이 캡처되므로 실시간으로 가장 가까운 위치를 파악하려고 합니다.
기능은 성능을 얻을 수 있는 곳이 아닙니다. (Bill이 그것에 대해 논의했습니다.)알고리즘은 성능을 얻을 수 있는 부분입니다.(저는 그것에 대해 이야기하겠습니다.)
단순한 선택은 백만 줄의 각각의 거리를 확인하는 것을 포함합니다.당신이 발견한 것처럼, 이것은 확장할 수 없습니다.
다음이 옵니다.INDEX(lat, lng), INDEX(lng, lat)
그리고 경계 상자를 사용합니다.그것은 매그니튜드의 속도를 증가시킵니다.
사용함으로써 유사한 개선 효과를 얻을 수 있습니다.SPATIAL
값과 색인.
가장 가까운 곳 찾기에서 이 세 가지 접근 방식에 대해 자세히 설명합니다.이 링크를 사용하면 두 개의 알고리즘이 더 빠르게 제공되지만, 몇 백만 개의 행에 대해서는 그렇게 많은 개선(및 복잡성)이 필요하지 않을 수도 있습니다.
당신이 오해하고 있는 것 같습니다.DETERMINISTIC
에 대한 옵션으로서의 수단.CREATE FUNCTION
.
기능의 결과가 메모되어 있다는 의미는 아닙니다.함수 결과의 캐시가 없습니다.결과가 유지되지 않기 때문에 이 캐시를 새로 고치는 명령이 없습니다.
의 의미DETERMINISTIC
주로 이진 로그에 영향을 줍니다.
https://mariadb.com/kb/en/create-function/ #비통계적
그
[NOT] DETERMINISTIC
조항은 이진 로깅에도 영향을 미칩니다. 왜냐하면STATEMENT
비결정론적 문을 저장하거나 복제하는 데 형식을 사용할 수 없습니다.
즉, 비결정론적 함수가 복제본에서 실행될 경우 다른 결과를 반환할 수 있으므로 데이터를 수정하는 SQL 문에서 함수를 사용할 경우 해당 이벤트에 대한 이진 로그 형식은ROW
동일한 변경사항이 복제본에 적용되는지 확인합니다.
모호한 언급도 있습니다.
최적화 도구는 함수가 결정론적이라는 것을 알고 있는 경우 더 빠른 실행 계획을 선택할 수 있습니다.
그러나 그러한 경우에 대한 예는 제공되지 않습니다.이는 상당한 성능 차이를 만드는 드문 일이 될 것입니다.
이것이 귀사의 사용 사례에 효과적인 성능 최적화가 될 것이라고 생각하지 않습니다.
언급URL : https://stackoverflow.com/questions/71452201/how-to-clear-mysql-deterministic-function-result-cache
'programing' 카테고리의 다른 글
ASP를 렌더링합니다.HTML5 형식의 NET 텍스트 상자 입력 유형 "번호" (0) | 2023.08.15 |
---|---|
jQuery에서 확인란 값을 검색하는 방법 (0) | 2023.08.15 |
요청 설정 방법.양식을 사용하지 않을 때 true로 인증됨인증.로그인 페이지에서 리디렉션하시겠습니까? (0) | 2023.08.15 |
'Invoke-WebRequest' 용어가 cmdlet의 이름으로 인식되지 않습니다. (0) | 2023.08.15 |
압축 보관에서 폴더를 제외하려면 어떻게 합니까? (0) | 2023.08.15 |