Si possono fare delle inner join, evenualmente, ma non credo molto di più e si rischia di rendere l'elaborazione più complessa di quel che serve.
Una querettona complessa potrebbe anche peggiorare le cose...una like sembra comunque da fare, non credo sia il caso di appesantire ulteriormente la ricerca. Anche su 5 milioni di record, se gli indici sono ben fatti, estrarre 5000 record "secchi" non è impegnativo e ciclare 5000 * n volte, dato che l'elaborazione per scrivere un csv non è niente di complicatissimo, idem.
Ho provato su 3,5 milioni di record
codice:
Stato Tempo
starting 0.000023
checking query cache for query 0.000068
Opening tables 0.000021
System lock 0.000009
Table lock 0.000045
init 0.000055
optimizing 0.000016
statistics 0.000021
preparing 0.000019
executing 0.000007
Sending data 0.018813
end 0.000020
query end 0.000008
freeing items 0.000048
storing result in query cache 0.000013
logging slow query 0.000007
cleaning up 0.000008
Questa è la struttura della tabella
codice:
CREATE TABLE IF NOT EXISTS `spider_logs` (
`sid` int(10) NOT NULL AUTO_INCREMENT,
`bot` varchar(255) COLLATE latin1_general_ci NOT NULL DEFAULT '',
`query_string` text COLLATE latin1_general_ci NOT NULL,
`entry_date` int(10) NOT NULL DEFAULT '0',
`ip_address` varchar(32) COLLATE latin1_general_ci NOT NULL DEFAULT '',
PRIMARY KEY (`sid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3495510 ;
e la query
codice:
SELECT *
FROM `spider_logs`
WHERE `query_string` LIKE '%topic%'
Il carico macchina al momento dell'esecuzione della query è 7 (lo dico perchè a carico minore forse ci mette meno)
Comunque, di prim'acchitto quella che ho proposto mi pare la soluzione più semplice, date le specifiche dell'utente. Vediamo cosa ne salta fuori dagli altri