Mailinglisten-Archive |
Hallo, ich bin gerade dabei eine Datenbank für eine Suche zu erstellen, bin auch ganz zufrieden damit, wollte aber mal hören ob ich da noch was verbessern kann. Ich habe folgendes gemacht. 1 Tabelle für die Titel, wobei jedes Wort nur einmal gespeichert ist und die dazu gehörigen Artikel in der Tabelle aus `ref` liegen. CREATE TABLE `word_list_title` ( `id` int(10) unsigned NOT NULL auto_increment, `word` char(20) default NULL, `ref` char(14) default NULL, `lastchange` timestamp ... on update CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `word` (`word`) ... 15330 unterschiedliche Wörter. id | word | ref | lastchange | 2 | latex | suche.ref_t_l | 2005-08-26 09:56:40 | 3 | schwarz | suche.ref_t_s | 2005-08-26 09:56:40 | 4 | mama | suche.ref_t_m | 2005-08-26 09:56:40 | Die selbe Tabelle für die Inhalte. CREATE TABLE `word_list_desc` ( `id` int(10) unsigned NOT NULL auto_increment, `word` char(20) default NULL, `ref` char(14) default NULL, `lastchange` timestamp ... on update CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `word` (`word`) ... 37077 unterschiedliche Wörter. Jetzt hab ich für `word_list_title`.`ref` jeweil eine tabelle, die sich aber immer auf den anfangsbuchstaben bezieht. Also 27 Tabelle die alle folgendermaßen aussehen: CREATE TABLE `ref_t_a` ( `id` int(10) unsigned NOT NULL auto_increment, `word_id` int(10) unsigned NOT NULL default '0', `item_id` int(10) unsigned NOT NULL default '0', `lastchange` timestamp ... on update CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `word_id` (`word_id`), KEY `item_id` (`item_id`) Dasselbe auch noch mal für `word_list_desc`.`ref`, auch 27 Tabellen. Insgesamt sind es 538 MB an Daten. Jetzt hab ich mir ein Programm geschrieben das mir Suchanfragen simuliert. Ich hab mir das folgendermaßen überlegt, erst suche ich mir die `ref` tabelle zu jedem wort wobei im Titel und Inhalt gesucht werden soll: select SQL_CALC_FOUND_ROWS `id`, `ref` from `word_list_title` as T where T.word in ( 'latex' ,'schwarz' ,'mama' ) union select `id`, `ref` from `word_list_desc` as D where D.word in ( 'latex' ,'schwarz' ,'mama' ) Aus der Ergebnisliste suche ich mir dann alle item_id raus, je nachdem ob die Suchanfrage eine OR oder AND ist, leider hab ich noch keine Idee wie ich das ganze folgendermaßen verknüpfen kann: latex AND schwarz OR mama (ist aber nicht so wichtig jetzt) Bei einer OR abfragen gehen ich so vor: create table if not exists `temp_00001` (item_id int not null primary key) select SQL_CALC_FOUND_ROWS item_id from suche.ref_t_l as t where word_id = 2 union DISTINCT select item_id from suche.ref_t_m where word_id = 4 union DISTINCT select item_id from suche.ref_t_s where word_id = 3 union DISTINCT select item_id from suche.ref_d_l where word_id = 168 union DISTINCT select item_id from suche.ref_d_m where word_id = 5583 union DISTINCT select item_id from suche.ref_d_s where word_id = 238 group by item_id und bei einer AND abfragen create table if not exists `temp_00001` (item_id int not null primary key) select SQL_CALC_FOUND_ROWS t.item_id from suche.ref_t_l AS t INNER JOIN suche.ref_t_m AS t1 ON (t1.word_id = 4 AND t.item_id = t1.item_id ) INNER JOIN suche.ref_t_s AS t2 ON (t2.word_id = 3 AND t1.item_id = t2.item_id ) INNER JOIN suche.ref_d_l AS t3 ON (t3.word_id = 168 AND t2.item_id = t3.item_id ) INNER JOIN suche.ref_d_m AS t4 ON (t4.word_id = 5583 AND t3.item_id = t4.item_id ) INNER JOIN suche.ref_d_s AS t5 ON (t5.word_id = 238 AND t4.item_id = t5.item_id ) where t.word_id = 2 and t1.word_id = 4 and t1.item_id IS NOT NULL and t2.word_id = 3 and t2.item_id IS NOT NULL and t3.word_id = 168 and t3.item_id IS NOT NULL and t4.word_id = 5583 and t4.item_id IS NOT NULL and t5.word_id = 238 and t5.item_id IS NOT NULL group by t.item_id Der Grund warum ich das mache ist, das die FULLTEXT Engine nicht wirklich schnell ist, wenn man in einem Index Sucht der über 200.000 Einträge hat, die dann auch länger als AVG=1194 Zeichen sind. Wenn ich mit meinen Überlegungen völlig auf dem Holzweg bin, na ja, gute Ideen sind wirklich immer willkommen. Ciao Thomas -- Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter -->> http://www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive