necesita una alternativa más rápida para FIND_IN_SET al unir tables

Deseo realizar una selección si la ID. TABLA1 se encuentra en la columna TABLA2 separada por comas.

table1: +---------+ | id | +---------+ |12345678 | +---------+ |12322222 | +---------+ table2: +---------------------------------------------+ | manyids | +---------------------------------------------+ |12345678,1111111,2222233,0000111,65321 | +---------------------------------------------+ |2222233,12322222 | +---------------------------------------------+ |12322222 | +---------------------------------------------+ 

Esto funciona bien en una tabla de testing más pequeña:

 SELECT table1.id, COUNT(table1.id) AS occurences FROM table1 JOIN table2 ON FIND_IN_SET(table1.id, table2.manyids ) > 0 GROUP BY table1.id HAVING occurences > 0 ORDER BY occurences DESC 

Sin embargo, la TABLA1 real que quiero realizar select tiene más de 500k filas y FIND_IN_SET es demasiado lenta. Alguna alternativa?

La única alternativa sensata será normalizar las tablas:

Ejemplo

 table tag --------- id integer auto_increment primary key name varchar(40) table article ------------- id integer auto_increment primary key title varchar(1000) content text table tag_link -------------- article_id integer foreign key references article(id) tag_id integer foreign key references tag(id) primary key article_id, tag_id 

Debido a que todos los campos están indexados, puede realizar consultas de manera fácil y rápida:

 SELECT t.name FROM article AS a INNER JOIN tag_link tl ON (tl.article_id = a.id) INNER JOIN tag t ON (t.id = tl.tag_id) WHERE a.id = '45785' 

Opción 2 mala idea, mucho peor que la opción 1
Si realmente no puede cambiar la configuration, cree un índice de fulltext en campo manyids .

Y cambie la consulta a:

 SELECT table1.id, COUNT(table1.id) AS occurences FROM table1 JOIN table2 ON MATCH(table2.manyids) AGAINST (CONCAT("+'",table1.id,"'") IN BOOLEAN MODE) /*boolean mode is requinetworking*/ GROUP BY table1.id HAVING occurences > 0 ORDER BY occurences DESC 

Si alguna identificación está en la list de palabras prohibidas, no coincidirá. Tenga en count que no hay numbers en esta list.

Campo de golf
http://dev.mysql.com/doc/refman/5.5/en/fulltext-stopwords.html
http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

Tenga en count que deberá modificar la longitud de palabra mínima y máxima que tiene en count el índice de text completo: consulte: http://dev.mysql.com/doc/refman/5.5/en/fulltext-fine-tuning.html.