<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.grafactory.net/blog/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>L'appartement - innodb</title>
  <link>http://www.grafactory.net/blog/</link>
  <description></description>
  <language>fr</language>
  <pubDate>Wed, 12 Nov 2008 14:50:40 +0000</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Recherche Fulltext et InnoDB avec Mysql</title>
    <link>http://www.grafactory.net/blog/post/2007/09/07/Recherche-Fulltext-et-InnoDB-avec-Mysql</link>
    <guid isPermaLink="false">urn:md5:c70ad4563922462c4b58283621606501</guid>
    <pubDate>Mon, 10 Sep 2007 11:22:00 +0200</pubDate>
    <dc:creator>Yves Tannier</dc:creator>
        <category>Le codage</category>
        <category>fulltext</category><category>innodb</category><category>mysql</category>    
    <description>    &lt;p&gt;&lt;img src=&quot;http://www.grafactory.net/blog/public/images/icones/mysql_100x52-64.gif&quot; alt=&quot;Logo Mysql&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; /&gt;Les avantages de l'utilisation du moteur de stockage &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/fr/innodb-overview.html&quot; hreflang=&quot;fr&quot;&gt;InnoDB&lt;/a&gt; par rapport à &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/fr/myisam-storage-engine.html&quot; hreflang=&quot;fr&quot;&gt;MysIsam&lt;/a&gt; sur une base de données &lt;a href=&quot;http://www.mysql.fr/&quot; hreflang=&quot;fr&quot;&gt;Mysql&lt;/a&gt; (à partir de la version 5.02) sont non négligeables sur certains projets. Il permet l'utilisation&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;de contraintes d'intégrité (Foreign Key ect...)&lt;/li&gt;
&lt;li&gt;de &lt;em&gt;triggers&lt;/em&gt; (déclencheurs en français dans le texte).&lt;/li&gt;
&lt;li&gt;de procédures stockées&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un inconvénient est, par contre, particulièrement pénalisant dès qu'on envisage un moteur de recherche en &quot;texte intégral&quot;. Il est en effet impossible de créer des &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/fr/fulltext-search.html&quot; hreflang=&quot;fr&quot;&gt;index FULLTEXT&lt;/a&gt; avec le moteur InnoDB&amp;nbsp;! L'utilisation des MATCH et autres joyeusetés est donc impossible. Le classement pertinent des résultats devient plus compliqué à mettre en oeuvre.&lt;/p&gt;


&lt;p&gt;Je me suis retrouvé confronté à ce problème récemment et voici comment je l'ai contourné. Je résume, pour l'exemple, en une unique table, ma structure de données qui en compte quelques dizaines.&lt;/p&gt;


&lt;p&gt;J'ai donc une table &quot;texts&quot; qui utilise InnoDB avec quelques champs dont le &quot;title&quot; sur lequel je souhaite faire les recherches (la clé primaire s'appelle &quot;idtext&quot;).&lt;/p&gt;


&lt;p&gt;J'ai créé une table &quot;searchs_texts&quot; avec le moteur MyIsam, deux champs -   idtext/title - &lt;strong&gt;et&lt;/strong&gt; un index FULLTEXT sur le champ &quot;title&quot;.&lt;/p&gt;


&lt;p&gt;Cette table contient, vous l'aurez compris, l'exacte correspondance des champs idtext/title de la table texts.&lt;/p&gt;


&lt;p&gt;Reste à tenir à jour cette table sans modifier le code de tous le site. Les &lt;strong&gt;triggers&lt;/strong&gt; vont nous être bien utile pour ça&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;Un pour l'INSERT&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
CREATE TRIGGER trigger_insert_texts
AFTER INSERT ON texts
FOR EACH ROW
INSERT INTO searchs_texts SET idtext=NEW.idtext, title=NEW.title;
&lt;/pre&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Un pour l'UPDATE&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
CREATE TRIGGER trigger_update_texts
AFTER UPDATE ON texts
FOR EACH ROW
UPDATE searchs_texts SET title=NEW.title WHERE idtext=OLD.idtext;
&lt;/pre&gt;

&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;Et enfin, un pour le DELETE&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
CREATE TRIGGER trigger_delete_texts
AFTER DELETE ON texts
FOR EACH ROW
DELETE FROM searchs_texts WHERE idtext=OLD.idtext;
&lt;/pre&gt;


&lt;p&gt;Et voilà. Le tour est joué&amp;nbsp;! Maintenant, votre moteur de recherche pourra utiliser &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/fr/fulltext-boolean.html&quot; hreflang=&quot;fr&quot;&gt;tous ce qui est disponible&lt;/a&gt; et bientôt concurrencer Google &lt;img src=&quot;/blog/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.grafactory.net/blog/post/2007/09/07/Recherche-Fulltext-et-InnoDB-avec-Mysql#comment-form</comments>
      <wfw:comment>http://www.grafactory.net/blog/post/2007/09/07/Recherche-Fulltext-et-InnoDB-avec-Mysql#comment-form</wfw:comment>
      <wfw:commentRss>http://www.grafactory.net/blog/feed/rss2/comments/150</wfw:commentRss>
      </item>
    
  <item>
    <title>Passage sur Dotclear 2 Beta7</title>
    <link>http://www.grafactory.net/blog/post/2007/07/17/Passage-sur-Dotclear-2-Beta7</link>
    <guid isPermaLink="false">urn:md5:683ee4c9ead100dc363ddacd2cf41db5</guid>
    <pubDate>Tue, 17 Jul 2007 10:22:00 +0200</pubDate>
    <dc:creator>Yves Tannier</dc:creator>
        <category>Le PHP</category>
        <category>dotclear</category><category>innodb</category><category>mysql</category>    
    <description>    &lt;p&gt;Apparement, il y avait une grosse faille de sécurité chez Dotclear. J'ai donc mis à jour. Pour mon blog, pas de problème. Pour la plateforme multiblogs que je gère, ca a été plus compliqué.&lt;/p&gt;


&lt;p&gt;Le moteur utilisé par Dotclear 2 avec Mysql maintenant InnoDB. C'est bien. Il y a des belles contraintes d'intégrité partout &lt;img src=&quot;/blog/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Va savoir pourquoi, l'intégrité n'était plus de mise sur la base multiblogs, il y avait des enregistrements orphelins qui ne faisaient plus référence.  J'ai du donc nettoyer un peu&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
DELETE FROM `dc_post` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_category` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_link` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_permissions` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_setting` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_spamrule` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_media` WHERE user_id NOT IN (SELECT user_id FROM dc_user);
DELETE FROM `dc_comment` WHERE post_id NOT IN (SELECT post_id FROM dc_post);
DELETE FROM `dc_media` WHERE user_id NOT IN (SELECT user_id FROM dc_user);
DELETE FROM `dc_post_media` WHERE media_id NOT IN (SELECT media_id FROM dc_media);
DELETE FROM `dc_post_media` WHERE post_id NOT IN (SELECT post_id FROM dc_post);
&lt;/pre&gt;


&lt;p&gt;Ca pourrait-être intégré dans le code de Dotclear avant une mise à jour ?!&lt;/p&gt;</description>
    
    
    
          <comments>http://www.grafactory.net/blog/post/2007/07/17/Passage-sur-Dotclear-2-Beta7#comment-form</comments>
      <wfw:comment>http://www.grafactory.net/blog/post/2007/07/17/Passage-sur-Dotclear-2-Beta7#comment-form</wfw:comment>
      <wfw:commentRss>http://www.grafactory.net/blog/feed/rss2/comments/147</wfw:commentRss>
      </item>
    
</channel>
</rss>