2013-01-18 10 views
5

Utilizzo di MYSQL, con EF 5.xe MVC3. Ho un tavolo con circa 3,2 milioni di file che ha una combinazione di città, paese. Ho una casella di testo a completamento automatico sul lato client che accetta il termine di ricerca della città e invia i suggerimenti utilizzando jQuery/ajax.Tabelle statiche cache Mysql

La sfida che sto affrontando è che io Cache questo tavolo nella mia memoria quando il suo usato per la prima volta utilizzando:

 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); 
     } 

Questo timeout, anche quando ho impostato il mio timeout db-context per 5 minuti. Quando eseguo questo SQL contro il DB utilizzando il client MySQL ci vogliono circa 3 minuti per tirare tutte le righe.

Qual è il modo migliore per leggere questi dati nella cache o devo fare qualcosa di diverso? Posso memorizzare la tabella nella cache direttamente nella memoria cache di MySQL se sì, come? O dovrei inviare il termine search direttamente a DB invece di farlo usando i dati nella cache.

+1

Se è per il completamento automatico, non avresti una query che utilizza il termine di ricerca e recupera solo risultati rilevanti? O è che vuoi che la query di ricerca scappi dai dati memorizzati nella cache? – MikeSmithDev

+2

@MikeSmithDev fa un buon punto, probabilmente state meglio mettere in cache le singole query sul database. È possibile memorizzare la query nella cache per un lungo periodo di tempo, quindi dopo un po 'una grande percentuale delle ricerche non andrà al database. Hai anche la possibilità di memorizzare nella cache il json risultante come un file, in questo modo devi solo restituire il file json non appena ricevi una tale richiesta. – cowls

+0

sì, il termine di ricerca va contro i dati memorizzati nella cache –

risposta

0

Accordo con i commenti alla tua domanda Vorrei anche suggerire, con quella fila di file, è probabile che limiti i ritorni sul tuo auto-completamento? (prendendo la top 10). Il round trip nel DB per questo non dovrebbe essere un collo di bottiglia importante a meno che non si stia tentando di restituire tutti i risultati su ogni sequenza di tasti.

Se si tratta di un collo di bottiglia, potrei cercare di risolvere questo problema effettuando una chiamata asincrona al DB su ogni sequenza di tasti continuando a filtrare i risultati che sono stati già estratti localmente. Penso che otterrete risultati più veloci riordinando la vostra lista nel DB e interrogando nuovamente il risultato della performance di provare a farlo nel codice in ogni caso - se sto capendo il vostro intento/domanda correttamente.

Attenzione: non sono ancora stato nella posizione in cui un round trip generico per l'approccio DB non è stato abbastanza veloce per le mie esigenze/volume di dati in un completamento automatico - qualcun altro che ha dovuto affrontare problemi di prestazioni qui potrebbe essere in grado di fornire ulteriori informazioni - eventuali letture di ingegneri di Google? :)

+0

Un altro pensiero: sarei piuttosto cauto nel tentare di risolvere i problemi di prestazioni che prevedi di avere prima che siano effettivamente un problema. Dall'esperienza personale ho sprecato un sacco di tempo cercando di scrivere codice * intelligente * per affrontare problemi che non finiscono comunque. – Matthew

+0

Questo perché ti sei rivolto a loro quando hai scritto il codice intelligente :) – cowls

+0

Sono tentato di credere che ... ma sarebbe solo incoraggiante comportamento più cattivo :) – Matthew