2013-05-22 14 views
6

Ho una tabella con 14 milioni di righe e sto cercando di eseguire una ricerca di testo completo su questa tabella. La query per questo è molto lenta, ci vogliono circa 9 secondi per una semplice query binario AND. La stessa roba viene eseguita immediatamente sul mio cluster privato. La dimensione di questa tabella è di circa 3,1 GB e contiene 14 milioni di righe. Qualcuno può spiegare questo comportamento dell'istanza RDS?MySQL Ricerca di testo completo estremamente lenta su un'istanza di AWS RDS di grandi dimensioni

SELECT count(*) 
FROM table_name WHERE id=97 
AND match(body) against ('+data +big' IN BOOLEAN MODE) 
+0

si prega di inviare il quey – Stephan

+0

Si può confrontare il piano di esecuzione su entrambi gli ambienti? Per favore pubblicali entrambi se diversi. – RandomSeed

+0

'SELEZIONA Spiega' mostrando la stessa roba su entrambe le macchine. – user883499

risposta

3

Un'alta percentuale di I/O spesso indica memoria insufficiente o buffer troppo piccoli. Una tabella da 3 GB, inclusi gli indici, dovrebbe essere inserita interamente nella memoria di un server dedicato (molto meno di) $ 500 al mese.

MySQL ha molti buffer diversi e come many parameters con cui giocare. I seguenti tamponi sono i più importanti, confrontano le loro dimensioni nei due ambienti:

Se InnoDB: innodb_buffer_pool_size

Se MyISAM: key_buffer_size e read_buffer_size

0

hanno aggiunto FULLTEXT index su body colonna se non allora provate questo sicuramente farà una grande differenza

ALTER TABLE `table_name` ADD FULLTEXT INDEX `bodytext` (`body`); 

Speranza che aiuta

+0

Sì, esiste già un indice di testo completo. – user883499

0

Prova questo

SELECT count(1) 
FROM table_name WHERE id=97 
AND match(body) against ('+data +big' IN BOOLEAN MODE) 

Questo dovrebbe accelerare un po 'dal momento che non devi contare tutti i col umn solo le righe.

Puoi pubblicare la spiegazione stessa?

+0

Inoltre, qual è la lunghezza minima delle parole? Potrebbe essere così grande una parola d'arresto in modo che le sue ricerche solo sulla parola dati? –

0

Poiché la versione DB, la tabella, gli indici e i piani di esecuzione sono gli stessi, è necessario confrontare le configurazioni macchina/cluster. Principali punti di confronto Potenza della CPU disponibile, core utilizzati nella singola transazione, velocità di lettura dello storage, dimensioni della memoria e velocità di lettura/frequenza. Riesco a vedere che Amazon offre una varietà di configurazioni, quindi forse il tuo cluster privato è molto più potente della config di istanza di Amazon RDS.

Per aggiungere sopra, è possibile livellare il carico tra CPU, IO e memoria per aumentare il throughput.

0

Utilizzando match() contro() si eseguono tua ricerca in tutta l'intero indice fulltext da 3 GB e in questo caso non è possibile forzare un altro indice.

Per velocizzare la query è necessario effettuare l'indice full-text più leggero in modo da poter:

1 - pulire tutti i personaggi inutili e stopwords dal vostro indice full-text

2 - creare più indici full-text e peek quello appropriato

3 - modificare le ricerche di testo completo nella clausola LIKE e forzare un altro indice come "id".

0

provare a posizionare id nell'indice di testo e dire:

partita (CORPO, ID) contro (+ big data + +97) e id = 97

Si potrebbe anche guardare sfinge che può essere usato con mysql facilmente.

Problemi correlati