<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>LoïcG &#187; murl</title>
	<atom:link href="http://blog.loicg.net/category/murl/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.loicg.net</link>
	<description>Carnet d&#039;un développeur web</description>
	<lastBuildDate>Tue, 21 Feb 2012 18:07:02 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Négocier avec une grosse jointure MySQL</title>
		<link>http://blog.loicg.net/webdev/optimisation-jointure-lef-mysql/</link>
		<comments>http://blog.loicg.net/webdev/optimisation-jointure-lef-mysql/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 14:05:20 +0000</pubDate>
		<dc:creator>Loïc</dc:creator>
				<category><![CDATA[murl]]></category>
		<category><![CDATA[WebDev]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blog.loicg.net/?p=1072</guid>
		<description><![CDATA[Récemment, j&#8217;ai ajouté un antispam sur murl.fr. Celui-ci est assez rudimentaire et se base sur un blacklistage de domaines (ou sous-domaines). Ainsi, je peux filtrer les urls à leur création, ainsi qu&#8217;à leur affichage. Sur murl, il existe une page qui liste les derniers liens créés et le &#171;&#160;top 10&#8243; (de clics) de la journée. [...]]]></description>
			<content:encoded><![CDATA[<p>Récemment, j&#8217;ai ajouté un <a href="http://blog.loicg.net/murl/blacklist-mur/">antispam sur murl.fr</a>. Celui-ci est assez rudimentaire et se base sur un blacklistage de domaines (ou sous-domaines).<br />
Ainsi, je peux filtrer les urls à leur création, ainsi qu&#8217;à leur affichage.</p>
<p>Sur <a href="http://murl.fr/" target="_blank">murl</a>, il existe une page qui liste les derniers liens créés et le &laquo;&nbsp;top 10&#8243; (de clics) de la journée. Les requêtes qui chargent les liens sur cette pages ont donc été modifiées pour intégrer la blacklist.<span id="more-1072"></span></p>
<p>Voici une de ces requêtes :</p>
<pre class="brush: sql; title: ; notranslate">SELECT lu.id, SUM( ls.clics ) AS cliclic
    FROM lil_stats ls
    INNER JOIN lil_urls lu
        ON ls.id = lu.id
    LEFT JOIN lil_domain_blacklist ldb1
        ON (ldb1.domain = lu.domain OR ldb1.domain = lu.subdomain)
        AND ldb1.b_display =1
WHERE ls.date=&quot;2010-10-31&quot;
    AND ldb1.id IS NULL
GROUP BY lu.id
ORDER BY cliclic DESC
LIMIT 0 , 10</pre>
<p>Cette requête fonctionnait très bien quand la table lil_domain_blacklist était petite (au début, elle faisait moins de 100 lignes&#8230;)</p>
<p>Puis, j&#8217;ai importé un énorme fichier de domaines reconnus comme spammeurs. Ce fichier comportait environ 150000 entrées, et là, ma requête ne passait plus et finissait par bloquer le serveur.</p>
<p>En faisant un explain de cette requête, on remarque que la table lil_domain_blacklist est analysée en entier, et qu&#8217;elle ne fait appel à aucun index&#8230;</p>
<p><a href="http://blog.loicg.net/wp-content/uploads/2010/10/murl_1288531203376.png"><img class="aligncenter size-medium wp-image-1074" title="Ancienne requête MySQL" src="http://blog.loicg.net/wp-content/uploads/2010/10/murl_1288531203376-300x29.png" alt="" width="300" height="29" /></a></p>
<p>J&#8217;ai donc décidé de changer les choses (en même temps, je n&#8217;avais pas trop le choix&#8230;), en séparant la jointure sur la table incriminée en deux jointures.</p>
<p>Voici la nouvelle requête :</p>
<pre class="brush: sql; title: ; notranslate">SELECT lu.id, SUM( ls.clics ) AS cliclic
    FROM lil_stats ls
    INNER JOIN lil_urls lu
        ON ls.id = lu.id
    LEFT JOIN lil_domain_blacklist ldb1
        ON ldb1.domain = lu.domain
        AND ldb1.b_display =1
    LEFT JOIN lil_domain_blacklist ldb2
        ON ldb2.domain = lu.subdomain
        AND ldb2.b_display =1
WHERE ls.date=&quot;2010-10-31&quot;
    AND ldb1.id IS NULL
    AND ldb2.id IS NULL
GROUP BY lu.id
ORDER BY cliclic DESC
LIMIT 0 , 10
</pre>
<p>Cette nouvelle version de la requête s&#8217;exécute en environ 0.025 secondes, ce qui est tout à fait correct.</p>
<p>En observant un explain de celle-ci, on constate que les 2 jointures sur la table lil_domain_blacklist utilisent correctement les index et retournent un nombre limité de lignes.</p>
<p><a href="http://blog.loicg.net/wp-content/uploads/2010/10/murl_1288531203375.png"><img class="aligncenter size-medium wp-image-1073" title="Nouvelle requête MySQL" src="http://blog.loicg.net/wp-content/uploads/2010/10/murl_1288531203375-300x40.png" alt="" width="300" height="40" /></a></p>
<p>Ainsi, je sais désormais qu&#8217;il vaut mieux, parfois, faire 2 jointures sur une même table qu&#8217;une seule jointure sur cette même table.</p>
<p>Et toi, ami lecteur, as-tu déjà fait face à ce cas de figure ?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loicg.net/webdev/optimisation-jointure-lef-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un système de blacklist pour mURL.fr</title>
		<link>http://blog.loicg.net/murl/blacklist-mur/</link>
		<comments>http://blog.loicg.net/murl/blacklist-mur/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 10:06:08 +0000</pubDate>
		<dc:creator>Loïc</dc:creator>
				<category><![CDATA[murl]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://blog.loicg.net/?p=1062</guid>
		<description><![CDATA[mURL, mon petit service de réduction d&#8217;URL, est victime depuis quelques temps de vils spammeurs qui masquent leurs URL derrière des liens raccourcis. Ainsi, dans le but de maintenir une bonne qualité de service (et accessoirement, ne pas me prendre une amende),  j&#8217;ai décidé d&#8217;ajouter un petit système de blacklist basé sur les sous-domaines et [...]]]></description>
			<content:encoded><![CDATA[<p>mURL, mon petit service de réduction d&#8217;URL, est victime depuis quelques temps de vils spammeurs qui masquent leurs URL derrière des liens raccourcis.</p>
<p>Ainsi, dans le but de maintenir une bonne qualité de service (et accessoirement, ne pas me prendre une amende),  j&#8217;ai décidé d&#8217;ajouter un petit système de blacklist basé sur les sous-domaines et domaines.<span id="more-1062"></span></p>
<p>Le blacklistage est à 3 vitesses:</p>
<ol>
<li>Un domaine (ou sous-domaine) peut créer des liens courts, ils sont fonctionnels, mais n&#8217;apparaissent pas de manière publique, c&#8217;est à dire sur <a href="http://murl.fr/-stats">http://murl.fr/-stats</a> et <a href="http://murl.fr/-domaine/">http://murl.fr/-domaine/</a></li>
<li>Un domaine ne peut pas créer de liens courts. Les liens existants sont encore utilisables, mais n&#8217;apparaissent pas de manière publique.</li>
<li>Si un domaine est blacklisté et qu&#8217;il génère de nombreux hits sur ces liens existants, je bloque les liens dans la base de données.</li>
</ol>
<p>Actuellement, je blackliste les domaines à la main car les spams sont encore suffisamment rares, mais j&#8217;imagine que progressivement, je mettrai un système automatisé en place.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loicg.net/murl/blacklist-mur/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using memcached (Feed is rejected)
Page Caching using memcached (User agent is rejected)
Database Caching 17/24 queries in 0.013 seconds using memcached

Served from: blog.loicg.net @ 2012-02-22 23:56:23 -->
