Ho un sito Web in cui i visitatori possono lasciare commenti. Voglio aggiungere la possibilità di rispondere ai commenti (ad esempio commenti nidificati).Ottimizza LEFT JOIN sul tavolo con 30.000+ righe
In un primo momento questa interrogazione è stato veloce, ma dopo che ho popolato la tabella con i commenti esistenti (circa 30000) una semplice query come:
SELECT c.id, c2.id
FROM (SELECT id
FROM swb_comments
WHERE pageId = 1411
ORDER BY id DESC
LIMIT 10) AS c
LEFT JOIN swb_comments AS c2 ON c.id = c2.parentId
preso più di 2 secondi, senza childComments (!).
Come ottimizzare una query come questa? Sulla soluzione possibile sarebbe http://www.ferdychristant.com/blog//articles/DOMM-7QJPM7 (scorrere fino a "Il modello di tabella flat fatto bene") ma ciò rende l'impaginazione piuttosto difficile (come limitare 10 commenti principali all'interno di 1 query?)
La tabella ha 3 indici, id, pageId e ParentId.
Grazie in anticipo!
MODIFICA:
Definizione tabella aggiunta. Questa è la definizione completa con alcune differenze a quanto sopra query SELECT, (cioè pageId anziché numberId evitare confussion)
CREATE TABLE `swb_comments` (
`id` mediumint(9) NOT NULL auto_increment,
`userId` mediumint(9) unsigned NOT NULL default '0',
`numberId` mediumint(9) unsigned default NULL,
`orgId` mediumint(9) unsigned default NULL,
`author` varchar(100) default NULL,
`email` varchar(255) NOT NULL,
`message` text NOT NULL,
`IP` varchar(40) NOT NULL,
`timestamp` varchar(25) NOT NULL,
`editedTimestamp` varchar(25) default NULL COMMENT 'last edited timestamp',
`status` varchar(20) NOT NULL default 'publish',
`parentId` mediumint(9) unsigned NOT NULL default '0',
`locale` varchar(10) NOT NULL,
PRIMARY KEY (`id`),
KEY `userId` (`userId`),
KEY `numberId` (`numberId`),
KEY `orgId` (`orgId`),
KEY `parentId` (`parentId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=34748 ;
Avete in programma di eseguire annidamenti illimitati? (ad esempio, puoi rispondere di nuovo a una risposta?) O solo a un livello di profondità massima? –
Cosa dice la SPIEGA? –
L'ID SELECT FROM swb_comments WHERE pageId = 1411 LIMIT 10 è lento? quanti colpi ottieni dall'ID genitore? –