Tengo una gran tabla (TokenFrequency) que tiene millones de filas en ella. La tabla TokenFrequency que se estructura como esta:SQL Alternativa para realizar una UNIÓN INTERNA en una sola tabla
Tabla - TokenFrequency
- id - int, clave primaria
- fuente - int, clave externa
- símbolo - charla
- recuento - int
Mi objetivo es seleccionar todas las filas en las que dos fuentes tienen el mismo token. Por ejemplo, si mi mesa era la siguiente:
Identificación --- --- fuente símbolo --- recuento
1 ------ --------- 1 perro - ----- 1
2 ------ 2 --------- cat -------- 2
3 ------ 3 ----- ---- cat -------- 2
4 ------ 4 --------- pig -------- 5
5 ---- - 5 --------- zoo ------- 1
6 ------ 5 --------- cat -------- 1
7 ------ 5 --------- cerdo -------- 1
Me gustaría una consulta SQL para darme la fuente 1, la fuente 2 y la suma de los recuentos. Por ejemplo:
Source1 --- --- source2 contador --- contar
---- 2 ----------- 3 --------- cat -------- 4
---- 2 ----------- 5 --------- cat -------- 3
---- 3 ----------- 5 --------- cat -------- 3
---- 4 ------- ---- 5 --------- -------- cerdo 6
tengo una consulta que tiene este aspecto:
SELECT F.source AS source1, S.source AS source2, F.token,
(F.count + S.count) AS sum
FROM TokenFrequency F
INNER JOIN TokenFrequency S ON F.token = S.token
WHERE F.source <> S.source
Esta consulta funciona bien, pero los problemas que tengo con él son que:
- Tengo una tabla TokenFrequency que cuenta con millones de filas y por lo tanto necesitan una alternativa más rápida para obtener este resultado.
- La consulta actual que tengo está dando duplicados. Por ejemplo su selección:
Source1 = 2, source2 = 3, token = gato, count = 4
Source1 = 3, source2 = 2, token = gato, count = 4
Lo cual no es demasiado de un problema pero si hay una manera de eludirlos y obtener un aumento de velocidad entonces sería muy útil
El principal problema que tengo es la velocidad de la consulta con mi consulta actual que lleva horas completar. El INNER JOIN en una mesa en sí mismo es lo que creo que es el problema. Estoy seguro de que tiene que haber una forma de eliminar la unión interna y obtener resultados similares simplemente usando una instancia de la tabla TokenFrequency. El segundo problema que mencioné también podría promover un aumento de velocidad en la consulta.
Necesito una forma de reestructurar esta consulta para proporcionar los mismos resultados de una manera más rápida y eficiente.
Gracias.
Puede publicar el EXPLAIN de la consulta (http://dev.mysql.com/doc/refman/5.0/en/explain.html). Ayudará a la gente a ver cómo pueden ayudarlo a optimizar. –
necesita dar alguna información de índice, qué columnas, etc. –
Aquí está mi EXPLICACIÓN de la consulta que publiqué inicialmente. id: 1, tipo_selección: SIMPLE, tabla: F & S, tipo: ALL, Possible_keys: NULL, Key: NULL, Key_len: NULL, ref: NULL, rows: 8, Extra: Using where; Usando el buffer de unión Se han devuelto dos filas, la única diferencia son los dos nombres de tabla F y S. – cruzja