Clever. Thanks for sharing. Regards, Kieran :-)
On Jan 14, 2010, at 9:45 AM, Timo Hoepfner wrote: > Ok, went a bit different way. I added a myisam table and added triggers for > insert/update/delete on the (now) innodb table to put a copy in the myisam > table which now has the fulltext index. As the app is read-mostly, the > additional load is not a problem. The PHP query needed to be adjusted to use > the other table for the fulltext search. > > For the record, this is basically what I did: > > ALTER TABLE `products` DROP INDEX `fulltextDE`; > ALTER TABLE `products` DROP INDEX `fulltextEN`; > ALTER TABLE products ENGINE=InnoDB; > > DROP TABLE IF EXISTS `_fulltext`; > CREATE TABLE `_fulltext` ( > `id` INT(11) NOT NULL, > `tbl` varchar(255), > `name` varchar(255), > `nameDE` varchar(255), > `nameEN` varchar(255), > `description_de` TEXT, > `description_en` TEXT, > PRIMARY KEY (`id`), > FULLTEXT KEY `fulltextDE` (`name`,`nameDE`,`description_de`), > FULLTEXT KEY `fulltextEN` (`name`,`nameEN`,`description_en`) > ) ENGINE=MyISAM; > > INSERT INTO _fulltext (`id`, `tbl`, `name`, `nameDE`, `nameEN`, > `description_de`, `description_en`) SELECT `id`, "products", `name`, > `nameDE`, `nameEN`, `description_de`, `description_en` FROM products; > > delimiter // > > DROP TRIGGER IF EXISTS products_i;// > CREATE TRIGGER products_i AFTER INSERT ON products > FOR EACH ROW > BEGIN > INSERT INTO _fulltext (`id`, `tbl`, `name`, `nameDE`, `nameEN`, > `description_de`, `description_en`) VALUES (NEW.id, "products", NEW.name, > NEW.nameDE, NEW.nameEN, NEW.description_de, NEW.description_en); > END;// > > DROP TRIGGER IF EXISTS products_u;// > CREATE TRIGGER products_u AFTER UPDATE ON products > FOR EACH ROW > BEGIN > UPDATE _fulltext SET tbl="products", `name`=NEW.name, `nameDE`=NEW.nameDE, > `nameEN`=NEW.nameEN, `description_de`=NEW.description_de, > `description_en`=NEW.description_en WHERE `id`=NEW.id; > END;// > > DROP TRIGGER IF EXISTS products_d;// > CREATE TRIGGER products_d AFTER DELETE ON products > FOR EACH ROW > BEGIN > DELETE FROM _fulltext WHERE id=OLD.id; > END;// > > delimter ; > > Thanks a lot for your suggestions. Now for the mysql optimizations... > > Timo > > Am 14.01.2010 um 04:08 schrieb Kieran Kelleher: > >> Hi Timo, >> >> If you mix MyISAM and InnoDB, then when a transaction fails, IIRC, just he >> InnoDB tables will rollback, the MyISAM tables will not. If important,to >> you, then you could potentially write some logic that if an ec save fails, >> then do some logic to delete the rows (EOs) inserted into the MyISAM tables. >> Also, perhaps some schema changes might allow the FULLTEXT search columns to >> be broken out into separate related tables in a similar fashion to how one >> might break out a BLOB image attribute into a separate table from an >> entity's table to prevent it unecessarily being hydrated from a fault into a >> real EO. This is just an idea ... I have not had to deal with your >> situation, but this is a possible approach: >> >> >> BEFORE >> Entity1 (maps to MyISAM table) >> attr1 >> attr2 >> fulltextattr >> >> AFTER >> Entity1 (maps to innodb table) >> attr1 >> attr2 >> FK <<---> Entity2 (maps to myisam table) >> PK >> fulltextattr >> >> >> The java logic of Entity can easily be changed so that the get and set pull >> the fulltextattr from the related eo. >> >> >> The advantage is that if a transaction fails halfway, you end up with a >> Entity2 in the DB and no corresponding Entity1. You can delete these orphans >> if an ec fails to save and the PHP logic can ignore search results where >> Entity2 has no related Entity1's. >> >> HTH, Kieran >> >> On Jan 13, 2010, at 4:01 PM, David LeBer wrote: >> >>> >>> On 2010-01-13, at 3:52 PM, Timo Hoepfner wrote: >>> >>>> Hi list, especially Kieran. :) >>>> >>>> I have a project that evolved over the years. Basically it's a product and >>>> image database, which also provides the content for the customer's home >>>> page. The product and image database and CMS administration is done in WO, >>>> the customer's home page was coded in PHP by someone else (other company), >>>> accessing the same DB (read only). Using MySQL was a customer requirement >>>> when the project started. >>>> >>>> The PHP stuff depends on MySQL's FULLTEXT search (with a custom stopwords >>>> configuration), which in turns requires the use of MYISAM. I'd really like >>>> to move the whole DB to InnoDB tables, but I have no clue how to keep the >>>> FULLTEXT stuff of the PHP part functional. >>>> >>>> It would be no problem to change the WO or PHP code (for which I now also >>>> have the honor to maintain) as long the stuff continues to work as >>>> expected. >>>> >>>> Any ideas? >>> >>> Timo, >>> >>> I know it's ugly, but you can mix InnoDB and MyISAM tables in the same >>> database. >>> >>> If the FULL TEXT indexes are only on a single/few tables/columns that may >>> be an option. >>> >>> Keep MyISAM for the FT tables, move everything else to InnoDB. >>> >>> ;david >>> >>> -- >>> David LeBer >>> Codeferous Software >>> 'co-def-er-ous' adj. Literally 'code-bearing' >>> site: http://codeferous.com >>> blog: http://davidleber.net >>> profile: http://www.linkedin.com/in/davidleber >>> twitter: http://twitter.com/rebeld >>> -- >>> Toronto Area Cocoa / WebObjects developers group: >>> http://tacow.org >>> >>> >>> >>> >>> _______________________________________________ >>> Do not post admin requests to the list. They will be ignored. >>> Webobjects-dev mailing list (Webobjects-dev@lists.apple.com) >>> Help/Unsubscribe/Update your Subscription: >>> http://lists.apple.com/mailman/options/webobjects-dev/kieran_lists%40mac.com >>> >>> This email sent to kieran_li...@mac.com >> > _______________________________________________ Do not post admin requests to the list. They will be ignored. Webobjects-dev mailing list (Webobjects-dev@lists.apple.com) Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com