2013-01-18 4 views
5

EF 5.x 및 MVC3과 함께 MYSQL 사용. 나는 도시, 국가 콤보가있는 약 320 만 행의 테이블을 가지고있다. 도시의 검색어를 사용하고 jQuery/ajax를 사용하여 제안을 다시 보내는 클라이언트 측에 자동 완성 텍스트 상자가 있습니다. 이것은 내가 5 분 내 DB-컨텍스트 시간 제한을 설정 한 경우에도 타임 아웃캐시 정적 테이블 MySQL

 CityData = DataContext.Citys.OrderBy(v => v.Country).ToList(); 

     if (CityData.Any()) 
     { 
      // Put this data into the cache for 30 minutes 
      Cache.Set("Citys", CityData, 30); 
     } 

: 내가 직면하고

도전은 처음으로 사용하기 위해 사용될 때 나는 내 기억으로이 테이블을 캐시 것입니다. MySQL 클라이언트를 사용하여 DB에 대해이 SQL을 실행하면 모든 행을 가져 오는 데 약 3 분이 걸립니다.

이 데이터를 캐시로 읽는 가장 좋은 방법은 무엇입니까? 아니면 다른 것을해야합니까? 테이블을 MySQL 캐시 메모리에 직접 캐시 할 수 있습니까? 또는 캐시의 데이터를 사용하는 대신 용어 검색을 DB에 직접 보내야합니다.

+1

자동 완성을 사용하는 경우 검색어를 사용하고 관련 결과 만 가져 오는 검색어가 없습니까? 또는 캐시 된 데이터에서 검색 쿼리를 실행하려고합니까? – MikeSmithDev

+2

@MikeSmithDev는 좋은 지적입니다. 아마도 데이터베이스에 개별 쿼리를 캐싱하는 것이 좋습니다. 오랜 기간 동안 쿼리를 캐시 할 수 있기 때문에 잠시 후 많은 양의 검색이 데이터베이스에 전달되지 않습니다. 결과 json을 파일로 캐싱 할 수있는 옵션이 있습니다. 그렇게하면 json 파일을 요청하는 즉시 반환 할 수 있습니다. – cowls

+0

예 캐시 된 데이터에 대해 검색어가 바뀜 –

답변

0

귀하의 질문에 대한 의견에 동의하면 그 많은 행에서 자동 완성에 대한 수익을 제한 할 가능성이 높습니다. (즉, 상부 (10)를 취함). 각 키 스트로크에서 모든 결과를 반환하려고하지 않는 한이 DB에 대한 왕복은 큰 병목 현상이 아니어야합니다.

병목 현상이있는 경우 이미 로컬로 가져온 결과를 계속 필터링하면서 각 키스트 록크에서 DB에 대한 비동기 호출을 수행하여 문제를 해결할 수 있습니다. DB에서 목록을 다시 정렬하고 결과를 코드에서 다시 시도하는 것보다 빠른 결과를 얻게 될 것이라고 생각합니다.

경고 : DB 접근 방식에 대한 일반적인 왕복이 내 요구/자동 완성 데이터 양에 비해 충분히 빠르지 않은 위치에 아직 있지 않았습니다. 성능 문제를 해결해야했던 다른 사람 Google 엔지니어가 읽고있는 추가 통찰력을 제공 할 수 있습니까? :)

+0

한 번 더 생각해 보겠습니다. 실제로 문제가되기 전에 예상 할 수있는 성능 문제를 해결하기 위해 다소 조심 스러울 것입니다. 개인적인 경험에서 나는 문제를 해결하기 위해 영리한 * 코드를 쓰려고 많은 시간을 낭비했다. 어쨌든 나는 끝내지 못한다. – Matthew

+0

그건 당신이 똑똑한 코드를 쓸 때 당신이 그들에게 말했기 때문입니다. – cowls

+0

나는 그것을 믿을 유혹에 차 있습니다. 그러나 그것은 단지 더 나쁜 행동을 장려 할 것입니다 :) – Matthew