2010-03-17 5 views
5

Nota: En esta pregunta, estoy usando el término "autocompletar" (o "búsqueda iterativa") para referirme a los resultados de la búsqueda de retorno a medida que escribe, p. Ej. como Google Search te da. Además, mi pregunta no es específica para aplicaciones web frente a aplicaciones de clientes gordos.¿Cómo se optimiza el rendimiento de la base de datos al proporcionar resultados para la búsqueda autocompletada/iterativa?

¿Cómo se suelen construir las consultas SQL SELECT para proporcionar un rendimiento decente para este tipo de consultas, especialmente en conjuntos de datos arbitrariamente grandes? En el caso en que la búsqueda solo haga una consulta en base a los primeros n caracteres (caso más fácil), aún estoy emitiendo un nuevo SELECCIONE resultado FROMtable WHERE entry LIKE ... en cada pulsación de tecla. Incluso con varias formas de almacenamiento en caché esto parece que podría dar como resultado un bajo rendimiento.

En los casos en que desee que su cadena de búsqueda arroje resultados con prefijos, subcadenas, etc., se trata de un problema aún más difícil. Si observa un caso de búsqueda de una lista de contactos, puede devolver resultados que coincidan con Nombre + Apellido, Apellido + Nombre o cualquier otra subcadena.

Respuesta

2

Las búsquedas como Google, Yahoo, etc. usan índices de texto completo para generar una lista de palabras clave de alto rendimiento.

Si realiza búsquedas iterativas en columnas de una sola palabra, no necesitará índices de texto completo y palabras clave. Puede usar LIKE en las columnas indexadas.

Como está haciendo la búsqueda mientras escriben, está haciendo solo el prefijo. Sus columnas indexadas seguirán obteniendo un rendimiento normal con una cláusula LIKE y una comodín haciendo búsquedas de "prefijo".

SELECT last_name FROM users WHERE last_name LIKE 'Adam%' 

Si es necesario buscar desde el otro extremo, tendrá un índice inverso, pero, por suerte, la gente no escribe al revés.

Emitirá una nueva instrucción SELECT para cada "búsqueda iterativa" pero en un temporizador. Solo si dejan de escribir, ¿emite otra consulta? Limitará el conjunto de resultados usando LIMIT o TOP para que la consulta pueda completarse tan pronto como llene 10 registros más o menos. Además, de esta manera solo estás enviando 10 registros por el cable.

SELECT last_name FROM users WHERE last_name LIKE 'Adam%' LIMIT 10 

Por supuesto, para un mejor rendimiento, last_name sería el índice principal. Un índice permite que la base de datos obtenga el valor sin tocar el registro real. Los índices primarios son a menudo contiguos, lo que los hace aún más rápidos.

Si por casualidad está buscando en una columna, pero devuelve otra, utilice un índice compuesto para que el motor de la base de datos aún pueda obtener el valor del índice, sin tocar el registro.

SELECT first_name FROM users WHERE last_name LIKE 'Adam%' LIMIT 10 

Para la consulta anterior, el índice principal sería (apellido, primer nombre).

El temporizador es la clave del rendimiento. Puede ajustar el temporizador para obtener el rendimiento que desea.

+0

@Marcus - ¡Esta respuesta es excelente, gracias! – Howiecamp

0

Esto se denomina "buscar mientras escribe" para lograr esto con la consulta Sql para obtener datos de esto.

select Emp_ID,Emp_Name,Father_Name,Email from Employee where Emp_Name like '" + textBox1.Text + "%' ORDER BY Emp_Name ASC 

Ahora bien, esta es la respuesta más generalizada si alguien quisiera aplicar esto en C# las formas (que sirve como una interfaz con la base de datos SQL).Ahora todo lo que escriba en textBox1 mostrará los resultados en dataGridView en su formulario. Debe insertar este código en el evento textBox1_TextChanged para obtener la implementación 'Buscar mientras escribe'. Espero que ayude a que tu propósito funcionó para mí ...

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
string query = "select Emp_ID,Emp_Name,Father_Name,Email from Employee where Emp_Name like '" + textBox1.Text + "%' ORDER BY Emp_Name ASC"; 
using (SqlCommand comand = new SqlCommand(query, con)) 
{ 
SqlDataAdapter da = new SqlDataAdapter(); 
da.SelectCommand = comand; 
DataTable ds = new DataTable(); 
ds.Locale = System.Globalization.CultureInfo.InvariantCulture; 
da.Fill(ds); 
dataGridView1.DataSource = ds; 
} 
} 
+0

El valor en 'textBox1.text' debe escaparse correctamente antes de usarlo en SQL. Por ejemplo, ¿qué pasará si 'textBox1.text' está almacenando' que está causando un error'' – VCD

Cuestiones relacionadas