Mam dużą tabelę (TokenFrequency), która ma miliony wierszy. Tabela TokenFrequency który jest skonstruowany tak:SQL Alternatywa dla wykonywania INNER JOIN na pojedynczej tabeli
stołowy - TokenFrequency
- id - int, klucz podstawowy
- źródła - int, klucz obcy
- żeton - char
- rachubę - int
Moim celem jest wybranie wszystkich wierszy, w których dwa źródła mają ten sam znacznik. Na przykład, jeśli mój stół wyglądał następująco:
id --- źródło --- --- żeton liczyć
1 ------ 1 --------- pies - ----- 1
2 ------ 2 --------- kot -------- 2
3 ------ 3 ----- ---- kot -------- 2
4 ------ 4 --------- świnia -------- 5
5 ---- - 5 --------- zoo ------- 1
6 ------ 5 --------- kot -------- 1
7 ------ 5 --------- świnia -------- 1
Chciałbym zapytanie SQL dać mi źródło 1, źródło 2 i sumę zliczeń. Np
źródła1 Source2 --- --- --- znacznik liczyć
---- 2 ----------- 3 --------- kot -------- 4
---- 2 ----------- 5 --------- kot -------- 3
---- 3 ----------- 5 --------- kot -------- 3
---- 4 ------- ---- 5 --------- -------- świnia 6
mam kwerendę, która wygląda tak:
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
Ta kwerenda działa poprawnie, ale problemy, które mam z nim są następujące:
- Mam tabeli TokenFrequency że ma miliony wierszy i dlatego muszą szybszą alternatywę, aby uzyskać ten wynik.
- Obecne zapytanie, które mam, daje duplikaty. Na przykład jego składzie:
Source1 = 2, Source2 = 3, znacznik = kot, count = 4
Source1 = 3, Source2 = 2, znacznik = kot, count = 4
co nie jest zbyt wielkim problemem ale jeśli istnieje sposób na wyelimino- wanie tych i z kolei uzyskanie zwiększenia prędkości, byłoby bardzo użyteczne.
Głównym problemem, który mam, jest prędkość zapytania z bieżącym zapytaniem, to zajmuje wiele godzin. INNER JOIN na stole sam w sobie jest tym, co uważam za problem. Jestem pewien, że musi istnieć sposób na wyeliminowanie sprzężenia wewnętrznego i uzyskanie podobnych wyników przy użyciu tylko jednej instancji tabeli TokenFrequency. Drugi problem, o którym wspomniałem, może również promować wzrost prędkości w zapytaniu.
Potrzebuję sposobu na restrukturyzację tego zapytania, aby zapewnić te same wyniki w szybszy i bardziej wydajny sposób.
Dzięki.
Czy możesz umieścić EXPLAIN zapytania (http://dev.mysql.com/doc/refman/5.0/en/explain.html). Pomoże to ludziom zobaczyć, jak mogą pomóc Ci zoptymalizować. –
musisz podać informacje o indeksie, które kolumny itp. –
Oto moje WYJAŚNIENIE z kwerendy, które początkowo wysłany. id: 1, select_type: SIMPLE, table: F & S, type: ALL, Possible_keys: NULL, Klucz: NULL, Key_len: NULL, ref: NULL, rows: 8, Extra: Using where; Korzystanie z bufora łączenia Istnieją dwa wiersze zwrócone, jedyną różnicą są dwie nazwy tabel F i S. – cruzja