AllesMeins: MySQL: Ideen zur Query-Optimierung (tmp-Table vermeiden)

Beitrag lesen

Hi,

ich arbeite zur Zeit mit einer großen Tabelle, auf der ich folgende Aufgabe ausführen will/muss:

Die Tabelle enthält gehörte Musiktitel von Usern. Also ein Feld "userName" und eines Namens "titelUrl" (ist etwas missverständlich benannt, ist keine URL im Sinne einer Webadresse, seht es einfach als eindeutige Id an). Nun will ich die Gemeinsamkeiten zwischen jedem Userpaar ermitteln. Also welche User haben mehr als XX Titel gemeinsam gehört. Man sieht also schon, das das kein Query im Sekundenbereich werden wird, aber im Moment liegen die erwarteten Laufzeiten im Bereich von Monaten und das würde ich doch gerne noch etwas reduzieren. Das größte Problem derzeit ist wohl, das ich bisher nicht darum komme das Anlegen von Temporären Tabellen zu vermeiden - und bei zig Millionen Einträgen dauert das natürlich. Mein derzeitige Stand ist:

  
SELECT  
COUNT(b.userName) as c  
FROM userTitel a  
INNER JOIN userTitel b ON b.titelUrl = a.titelUrl  
WHERE a.userName != b.userName  
GROUP BY b.userName  
HAVING c > 20;  

Explain:

+----+-------------+-------+-------+---------------+----------+---------+------------------------------+----------+----------------------------------------------+
| id | select_type | table | type  | possible_keys | key      | key_len | ref                          | rows     | Extra                                        |
+----+-------------+-------+-------+---------------+----------+---------+------------------------------+----------+----------------------------------------------+
|  1 | SIMPLE      | a     | index | titelUrl      | userName | 767     | NULL                         | 38401832 | Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | b     | ref   | titelUrl      | titelUrl | 767     | db.a.titelUrl                |        3 | Using where; Using index                     |
+----+-------------+-------+-------+---------------+----------+---------+------------------------------+----------+----------------------------------------------+

Das ist, wie gesagt, bisher nur ein Ansatz. Ich bin durchaus offen für Vorschläge, die das Konzept über den Haufen werfen, oder Teile der Arbeit in die darunterliegende Anwendung verlagern. Falls ich in der Anwendung rechnen soll, ist es nur wichtig, dass die Daten als Stream verwarbeitet werden können. Die Datenmenge ist zu groß um erst alle Ergebnisdatensätze in den Speicher der Anwendung zu laden und sie danach zu verarbeiten.
Das Ergebnis muss auch nicht 100% korrekt sein, falls euch also spontan Methoden einfallen mit den man das Ergebnis abschätzen kann, wäre dies auch in Ordnung. Es sollte nur einen möglcisht großen Anteil der User finden, die genug Titel gemeinsam haben