jQuery UI: aceleración de Autocompletar

Tengo autocompletado funcionando bien, pero estoy tratando de encontrar la manera de hacerlo más rápido. Aquí está mi HTML:

Country:  USA United Kingdom 
City: function renewAutocomplete() { $( "#city" ).autocomplete({ source: "searchCities/" + $('#country').val(), minLength: 2 }); }

La consulta PHP / mySQL es bastante básica:

 $term = $_GET['term']; $sql = "SELECT city FROM cities WHERE country_code = '{$country}' AND city LIKE '{$term}%'"; 

Por supuesto, esto significa una nueva consulta para cada golpe de teclado. Ayuda un poco agregar algo de almacenamiento en caché, pero todavía no es tan rápido como creo que debería ser.

Pregunta 1 Mi primer pensamiento fue obtener TODAS las ciudades en una llamada de db cuando se selecciona el país. ¿Hay alguna forma de asignar el JSON devuelto de todas las ciudades del país a una variable que pueda usar el autocompletado? Mis pruebas iniciales solo aparecerían en todas las ciudades mientras escribías:

  $.get("searchCities/" + $('#country').val(), function(data) { $( "#city" ).autocomplete({ source: data, minLength: 2 }); }); PHP: $sql = "SELECT city FROM cities WHERE country_code = '{$country}'"; 

Pregunta 2 Dado que las ciudades y los países no cambian mucho (por lo general), ¿sería más rápido tener un archivo plano con todos los valores?

¿O hay alguna otra forma de hacer una autocompletar más rápida?

Gracias.

  1. Autocompletar asume que si lo devuelve, es una respuesta válida. Entonces: no .

  2. Sí, tirar de un archivo plano sería mucho más rápido que golpear tu DB por cada golpe de tecla. Sin embargo, si arrojas un poco de almacenamiento en caché (Memcache) delante del DB, probablemente sea tan rápido como un archivo plano.

Pero realmente, debido a que (probablemente) está buscando un conjunto (relativamente) pequeño para su término, de todos modos será realmente rápido.

Desde una perspectiva de escala, pégalos en un archivo plano o usa el almacenamiento en caché.

Como nota al margen: mire en mysql_escape_string () para usar $ country y $ term. De lo contrario, estás abierto a los ataques de inyección SQL .