En MySql, quiero ubicar registros donde el valor de cadena en una de las columnas comienza con (o es lo mismo que) una cadena de consulta. La columna está indexada con el orden de clasificación apropiado. Sin embargo, no hay un índice de búsqueda de texto completo en la columna.En MySql, busque cadenas con un prefijo dado
Una buena solución será:
utilizar el índiceen la columna. Las soluciones que necesitan para iterar sobre todos los registros de la tabla no son lo suficientemente bueno (varios millones de registros de la tabla)
trabajar con cadenas con cualquier carácter valora. Algunos de los valores de columna contienen signos de puntuación. La cadena de consulta también podría. Tenga esto en cuenta si su solución incluye caracteres regex o similares. Las cadenas están codificadas en UTF-8, pero si su solución solo funciona con ASCII, podría ser útil.
El más cercano que tengo en este momento es
SELECT * FROM TableName WHERE ColumnName BETWEEN query AND <<query+1>>
Dónde <<query+1>>
se calcularán previamente a seguir lexicográfico query
en el orden de clasificación. Por ejemplo, si query
es "o hai", entonces <<query+1>>
es "o haj".
Perfecto - gracias. EXPLAIN de hecho indica una consulta de rango. Los documentos de MySql para LIKE indican que solo se deben escapar los siguientes caracteres: '%', '_': http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like . –
Podría mencionar que en el caso de que las cardinalidades de índice necesiten actualizarse, 'ANALYZE TABLE' es en teoría más rápido que' OPTIMIZE TABLE'. Sin embargo, la tabla todavía está bloqueada para escribir durante este tiempo. Ejecutar ANALYZE TABLE en una mesa mía con ~ 6 millones de filas tomó una buena hora. – Crast