Tengo dos tablas de base de datos: "lugares" y "traducciones". Las traducciones de los nombres de lugares se realizan mediante la selección de registros de "lugares", que no tienen las traducciones al idioma especificado aún:SQL: optimización de subconsulta "no disponible" o alternativas
SELECT `id`, `name`
FROM `places`
WHERE `id` NOT IN (SELECT `place_id` FROM `translations` WHERE `lang` = 'en')
Esto funcionó bien con 7 000 registros de lugares, pero chocaron cuando el número de traducciones alcanzó el 5 000. Desde entonces, la consulta tarda unos 10 segundos y devuelve el error:
2006 - MySQL server has gone away
Según entiendo, el problema principal aquí es la sub consulta de regresar a muchos resultados, bu cómo podría resolverlo, si necesito seleccionar todos los lugares que aún no están traducidos?
Mi plan B es crear un nuevo campo booleano en la tabla "lugares", llamado "traducido", y restablecerlo a "falso", cada vez que cambio de idioma - eso evitaría tener subconsulta. Sin embargo, ¿tal vez podría simplemente modificar mi declaración de SQL actual y evitar agregar campo adicional?
No es una respuesta, es más una sugerencia si aún es posible en la etapa de su proyecto. Cuando aparecieron los incesantes errores de "El servidor MySQL desapareció", transferí mi aplicación a Postgresql. Nunca miré hacia atrás desde – Hao