No soy un experto en MySQL, pero parece que las claves primarias de MySQL están agrupadas; querrá asegurarse de que ese sea el caso con sus claves principales; los índices agrupados definitivamente ayudarán a acelerar las cosas.
Una cosa, sin embargo, no creo que pueda tener dos claves "primarias" en ninguna tabla; su tabla de urls me parece bastante sospechosa por ese motivo.Sobre todo, debe asegurarse de que esas dos columnas en la tabla de URL estén indexadas a la empuñadura (un único índice numérico en cada una de ellas debería estar bien) porque se está uniendo a ellas, por lo que el DBMS necesita saber cómo hacerlo. encontrarlos rápidamente; eso podría ser lo que está pasando en tu caso. Si está escaneando toda la tabla tantas filas, entonces sí, podría estar sentado allí durante bastante tiempo mientras el servidor intenta encontrar todo lo que pidió.
También sugiero eliminar esa función CONCAT de la declaración de selección, y ver cómo eso afecta los resultados. Me sorprendería si eso no fuera un factor contribuyente de alguna manera. Simplemente recupere ambas columnas y maneje la concatenación luego, y vea cómo va eso.
Por último, ¿has descubierto dónde está el cuello de botella? Solo unirse a tres mesas de varios millones de filas no debería tomar mucho tiempo en absoluto (esperaría tal vez un segundo más o menos, solo echar un vistazo a sus tablas y consultas), siempre que las tablas estén correctamente indexadas. Pero si está presionando esas filas sobre una NIC lenta o ya pegada, a un servidor de aplicaciones con memoria insuficiente, etc., la lentitud podría no tener nada que ver con su consulta, sino con lo que sucede después de la consulta. Siete millones de filas son bastantes datos para ensamblar y desplazar, sin importar cuánto tiempo lleve el hallazgo de esas filas. Intente seleccionar solo una fila, en lugar de los siete millones, y vea cómo se ve por contraste. Si eso es rápido, entonces el problema no es la consulta, es el conjunto de resultados.
En realidad, si realmente desea obtener todas las filas devueltas, los índices pueden no ser útiles. Hacer una búsqueda de índice para cada valor en la tabla es probablemente más lento que escanear completamente las tablas y mezclarlas o combinarlas. –
Veo varios 100 megabytes de datos. Si todo encaja en la memoria, tienes razón. Pero un DBMS adecuado (y supongo que incluso MySQL 4.x, ya que es lo suficientemente adecuado) ignorará los índices existentes por sí mismo. – Leonidas