Ich habe eine Tabelle "Test" mit Millionen von Einträgen. Jede Zeile enthält ein Gleitkomma "Feature" und eine "Anzahl", wie oft diese Funktion im Element "id" vorhanden ist. Der Primärschlüssel für diese Tabelle ist die Kombination von "ID" und "Merkmal", d. H. Jeder Gegenstand kann mehrere Merkmale aufweisen. Es gibt normalerweise ein paar hundert bis ein paar tausend Feature-Einträge pro Artikel-ID.mySQL: Ist es möglich, diese Abfrage schneller zu machen?
create table test
(
id int not null,
feature double not null,
count int not null
);
Die Aufgabe ist es, die 500 am ähnlichsten Elemente zu einem bestimmten Referenzelement zu finden. Die Ähnlichkeit wird in der Anzahl identischer Merkmalswerte in beiden Elementen gemessen. Die Abfrage, die ich gefunden habe, ist unten zitiert, aber trotz der korrekten Verwendung von Indizes enthält der Ausführungsplan immer noch "temporary verwenden" und "using filesort", was eine unakzeptable Leistung für meinen Anwendungsfall ergibt.
select
t1.id,
t2.id,
sum(least(t1.count, t2.count)) as priority
from test as t1
inner join test as t2
on t2.feature = t1.feature
where t1.id = {some user supplied id value}
group by t1.id, t2.id
order by priority desc
limit 500;
Irgendwelche Ideen, wie man das verbessert? Das Schema kann geändert und Indizes nach Bedarf hinzugefügt werden.
Könnten Sie bitte die Ausgabe von SHOW CREATE TABLE test' posten? – Quassnoi
CREATE TABLE 'test' ( ' id' int (11) NOT NULL, 'feature' Doppel NOT NULL, ' count' int (11) NOT NULL, KEY 'idx_one' (' feature'), KEY 'idx_two' (' id') ) ENGINE = InnoDB DEFAULT CHARSET = utf8 ' – BuschnicK
Ich kann Ihnen auch eine 2MB 1.000.000 Zeile datadump senden, wenn Sie es wollen ... – BuschnicK