A jesli by znormalizowac baze danych, utworzyc takie tabele
ksiazki (czy co to ma byc?)
ID (PK) | tytul
slowa_kluczowe
ID (PK) | slowo_eng | slowo_pl
ksiazki_slowa_kluczowe (do utworzenia relacji wiele-do-wielu)
ksiazka_id(FK) | slowo_kluczowe_id (FK)
1. tabele slowa_kluczowe (jak napisales) juz masz, ladujesz ja do pamieci php tak aby odwolywac sie do niej:
$slowo_kluczowe[ 'angielska_nazwa' ][ 'polskie_tlumaczenie']
i
$slowo_kluczowe[ 'angielska_nazwa' ][ 'ID']
oszczedzasz mnostwo zapytan do bazy po pojedyncze rekordy, a w pamieci zajmie ci to powiedzmy 40.000 x 50B (/slowo) = 2MB -- tyle co nic

2. tabela ksiazki (albo to cos z tytulem)
lepiej utworzyc nowa tabele (i pozostawic ta stara z ID | tytul | slowo; slowo2; itd)
* Odczytujesz jeden rekord ze swojej tabeli, wyciagasz z niego tytul, a slowa kluczowe rozbijasz explode.
* Wstawiasz rekord do tabeli ksiazki i pobierasz, ID ktore zostalo wstawione (mysql_inserted_id)
* dla kazdego slowa kluczowego dla tego rekordu pobierasz jego tlumaczenie i ID w bazie
* do tabeli ksiazki_slowa_kluczowe dla kazdego ze slow kluczowych wstawiasz rekord (id_ksiazki, id_slowa_kluczowego)
3. jesli potrzebujesz zachowac poprzednia strukture bazy (zdenormalizowana) mozesz to zrobic
Mozesz tez tylko uzyc cachowania tlumaczen slow kluczowych (patrz p. 1) -- z tym ze pomijasz pobieranie ID.
Zbadaj (zmierz microtime() co zajmuje najwiecej czasu -- wyciaganie tlumaczen slow, dzielenie pola ze slowami kluczowymi na pojedyncze slowa, itd)
PS. Jak masz taka mozliwosci to zapusc swoj skrypt (na te 7 dni) a w miedzy czasie szukaj lepszego rozwiazania