Tengo una tabla de "prueba" que contiene millones de entradas. Cada fila contiene una "característica" de coma flotante y un "recuento" de la frecuencia con la que esta característica está presente en el elemento "id". La clave principal para esta tabla es la combinación de "id" y "característica", es decir, cada elemento puede tener múltiples funciones. Por lo general, hay un par de cientos a un par de miles de entradas de función por ID de artículo.mySQL: ¿es posible hacer esta consulta más rápido?
create table test
(
id int not null,
feature double not null,
count int not null
);
La tarea es encontrar los 500 elementos más similares a un elemento de referencia dado. La similitud se mide en el número de valores de características idénticas en ambos elementos. La consulta que he encontrado se cita a continuación, pero a pesar de utilizar índices de forma adecuada, su plan de ejecución todavía contiene "usar temporal" y "usar archivado", lo que da un rendimiento inaceptable para mi caso de uso.
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;
¿Alguna idea de cómo mejorar esto? El esquema se puede modificar e incluir índices según sea necesario.
Podría, por favor publicar la salida de SHOW CREATE TABLE test'? – Quassnoi
crear la tabla 'test' ( ' int id' (11) NOT NULL, 'feature' doble NOT NULL, ' int count' (11) NOT NULL, tecla 'idx_one' (' feature'), KEY 'idx_two' (' id') ) ENGINE = InnoDB DEFAULT CHARSET = utf8 ' – BuschnicK
También puedo enviarte un duplicado de datos de fila de 2,000.000.000 de unidades si lo deseas ... – BuschnicK