<?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>icez network &#187; optimize</title>
	<atom:link href="http://www.icez.net/blog/tags/optimize/feed" rel="self" type="application/rss+xml" />
	<link>http://www.icez.net/blog</link>
	<description>Technical Blog by icez network</description>
	<lastBuildDate>Mon, 30 Jan 2012 17:31:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>0061 &#124; PHP simple object cache</title>
		<link>http://www.icez.net/blog/111/php-simple-object-cache</link>
		<comments>http://www.icez.net/blog/111/php-simple-object-cache#comments</comments>
		<pubDate>Tue, 02 Jun 2009 16:32:51 +0000</pubDate>
		<dc:creator>icez</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[PHP Coding]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Server]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[optimize]]></category>

		<guid isPermaLink="false">http://www.icez.net/blog/?p=111</guid>
		<description><![CDATA[ระบบ cache มาอีกแล้ว เอ๊อกๆ คราวนี้เป็น object cache ครับ ไม่ใช่ cache ทั้งหน้าแบบคราวก่อน &#60;?php $_cachetime = 3600; $_cacheroot = '/path/to/cache/'; function cacheget&#40;$key&#41; &#123; global $_cachetime, $_cacheroot; $_cachename = sprintf&#40;'%x', crc32&#40;$key&#41;&#41;; $_cachefolder = $_cacheroot.substr&#40;$_cachename,0,2&#41;.'/'; $_cachefile = $_cachefolder.$_cachename; if &#40;file_exists&#40;$_cachefile&#41; &#38;&#38; &#40;filemtime&#40;$_cachefile&#41; &#62; time&#40;&#41; - $_cachetime &#124;&#124; &#40;file_exists&#40;$_cachefile.'.lock'&#41; &#38;&#38; time&#40;&#41; - filemtime&#40;$_cachefile.'.lock'&#41; &#60; 120&#41;&#41;&#41; &#123; return unserialize&#40;file_get_contents&#40;$_cachefile&#41;&#41;; &#125; return [...]]]></description>
			<content:encoded><![CDATA[<p>ระบบ cache มาอีกแล้ว เอ๊อกๆ<br />
คราวนี้เป็น object cache ครับ ไม่ใช่ cache ทั้งหน้าแบบคราวก่อน</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$_cachetime</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3600</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_cacheroot</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/path/to/cache/'</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">function</span> cacheget<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$_cachetime</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_cacheroot</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$_cachename</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%x'</span><span style="color: #339933;">,</span> <span style="color: #990000;">crc32</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$_cachefolder</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_cacheroot</span><span style="color: #339933;">.</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachename</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$_cachefile</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_cachefolder</span><span style="color: #339933;">.</span><span style="color: #000088;">$_cachename</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefile</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">filemtime</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefile</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$_cachetime</span> <span style="color: #339933;">||</span> 
		<span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefile</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.lock'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #990000;">filemtime</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefile</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.lock'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">120</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #990000;">unserialize</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefile</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">function</span> cachelock<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$_cacheroot</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$_cachename</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #009933; font-weight: bold;">%x</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">crc32</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$_cachefolder</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_cacheroot</span><span style="color: #339933;">.</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachename</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$_cachefile</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_cachefolder</span><span style="color: #339933;">.</span><span style="color: #000088;">$_cachename</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">umask</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefolder</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">mkdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefolder</span><span style="color: #339933;">,</span><span style="color: #208080;">0777</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #990000;">touch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefile</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.lock'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">function</span> cacheset<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$_cacheroot</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$_cachename</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%x'</span><span style="color: #339933;">,</span> <span style="color: #990000;">crc32</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$_cachefolder</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_cacheroot</span><span style="color: #339933;">.</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachename</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$_cachefile</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_cachefolder</span><span style="color: #339933;">.</span><span style="color: #000088;">$_cachename</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">umask</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefolder</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">mkdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefolder</span><span style="color: #339933;">,</span><span style="color: #208080;">0777</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_h</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefile</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'w'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_h</span><span style="color: #339933;">,</span> <span style="color: #990000;">serialize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_h</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">unlink</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefile</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.lock'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>วิธีติดตั้ง: </p>
<p>include ไฟล์ไปบนสุดเลย แก้ตัวแปร $_cacheroot กับ $_cachetime ด้วยนะครับ<br />
chmod 777 folder ตามที่ตั้งใน $_cacheroot ไว้ด้วย</p>
<p>วิธีเรียกใช้:</p>
<p>สมมติว่า cache คำสั่ง sql นะครับ<br />
ถ้าปกติใช้อย่างนี้</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'SELECT * FROM table'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>ก็แก้เป็นประมาณนี้</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'SELECT * FROM table'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$rows</span> <span style="color: #339933;">=</span> cacheget<span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        cachelock<span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$rows</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
                <span style="color: #000088;">$rows</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$row</span><span style="color: #339933;">;</span>
        cacheset<span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #339933;">,</span> <span style="color: #000088;">$rows</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rows</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.icez.net/blog/111/php-simple-object-cache/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>0060 &#124; PHP Dynamic page static HTML generator</title>
		<link>http://www.icez.net/blog/102/php-dynamic-page-static-html-generator</link>
		<comments>http://www.icez.net/blog/102/php-dynamic-page-static-html-generator#comments</comments>
		<pubDate>Mon, 25 May 2009 16:59:30 +0000</pubDate>
		<dc:creator>icez</dc:creator>
				<category><![CDATA[PHP Coding]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Server]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[optimize]]></category>

		<guid isPermaLink="false">http://www.icez.net/blog/?p=102</guid>
		<description><![CDATA[ชื่อยาวเป็นวา code อะไรวะ (วันหลังมา search จะเจอมั้ยเนี่ยตู 555) code นี้แปะด้านบนสุดของไฟล์ (จะใส่ใน auto prepend เลยก็ยังไหว) &#60;?php $_cachetime = 43200; $_info = parse_url&#40;$_SERVER&#91;&#34;REQUEST_URI&#34;&#93;&#41;; if &#40;!isset&#40;$_info&#91;'query'&#93;&#41;&#41; $_info&#91;'query'&#93; = ''; $_path = end&#40;explode&#40;'/', $_info&#91;'path'&#93;&#41;&#41;; $_info&#91;'query'&#93; = str_replace&#40;'&#38;nocache', '', $_info&#91;'query'&#93;&#41;; $_info&#91;'query'&#93; = str_replace&#40;'nocache&#38;', '', $_info&#91;'query'&#93;&#41;; $_info&#91;'query'&#93; = str_replace&#40;'nocache', '', $_info&#91;'query'&#93;&#41;; $_cachename = sprintf&#40;&#34;%x&#34;, crc32&#40;$_path.&#34;?&#34;.$_info&#91;'query'&#93;&#41;&#41;; $_cachefolder = '/path/to/cache/'.substr&#40;$_cachename,0,2&#41;.'/'; $_cachefile = $_cachefolder.$_cachename; if [...]]]></description>
			<content:encoded><![CDATA[<p>ชื่อยาวเป็นวา code อะไรวะ (วันหลังมา search จะเจอมั้ยเนี่ยตู 555)</p>
<p>code นี้แปะด้านบนสุดของไฟล์ (จะใส่ใน auto prepend เลยก็ยังไหว)</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$_cachetime</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">43200</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_info</span> <span style="color: #339933;">=</span> <span style="color: #990000;">parse_url</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;REQUEST_URI&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_info</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$_info</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_path</span> <span style="color: #339933;">=</span> <span style="color: #990000;">end</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_info</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'path'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_info</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&amp;nocache'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_info</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_info</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'nocache&amp;'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_info</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_info</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'nocache'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_info</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_cachename</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #009933; font-weight: bold;">%x</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">crc32</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_path</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;?&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_info</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'query'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_cachefolder</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/path/to/cache/'</span><span style="color: #339933;">.</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachename</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_cachefile</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_cachefolder</span><span style="color: #339933;">.</span><span style="color: #000088;">$_cachename</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;REQUEST_URI&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">'/'</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;REQUEST_METHOD&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'GET'</span> <span style="color: #339933;">&amp;&amp;</span>
    <span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;nocache&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
    <span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefile</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">filemtime</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefile</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$_cachetime</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">readfile</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefile</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">function</span> fetch_cache<span style="color: #009900;">&#40;</span><span style="color: #000088;">$_buffer</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$_cachefile</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_cachefolder</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">umask</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefolder</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
                <span style="color: #990000;">mkdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefolder</span><span style="color: #339933;">,</span><span style="color: #208080;">0777</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_h</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_cachefile</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_h</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_buffer</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_h</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$_buffer</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">ob_start</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'fetch_cache'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>code นี้ใส่ด้านท้าย (ใน auto append ก็ได้นะครับ)</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">ob_end_flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>* แก้ไขเพิ่ม 2009/05/28</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icez.net/blog/102/php-dynamic-page-static-html-generator/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>0031 &#124; MySQL: my.cnf</title>
		<link>http://www.icez.net/blog/38/mysql-mycnf</link>
		<comments>http://www.icez.net/blog/38/mysql-mycnf#comments</comments>
		<pubDate>Tue, 02 Sep 2008 07:31:06 +0000</pubDate>
		<dc:creator>icez</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[optimize]]></category>

		<guid isPermaLink="false">http://www.icez.net/blog/?p=38</guid>
		<description><![CDATA[เอามาเก็บไว้ฮะ สำหรับแรม 4gb ฐานข้อมูลขนาด 1 gb [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Default to using old password format for compatibility with mysql 3.x # clients (those using the mysqlclient10 compatibility package). old_passwords=1 set-variable=local-infile=0 skip-character-set-client-handshake skip-name-resolve skip-bdb max_connections = 600 key_buffer = 512M myisam_sort_buffer_size = 32M join_buffer_size = 1M read_buffer_size = 2M sort_buffer_size = 4M table_cache = [...]]]></description>
			<content:encoded><![CDATA[<p>เอามาเก็บไว้ฮะ สำหรับแรม 4gb ฐานข้อมูลขนาด 1 gb</p>
<blockquote>
<pre>[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
set-variable=local-infile=0
skip-character-set-client-handshake
skip-name-resolve
skip-bdb
max_connections = 600
key_buffer = 512M
myisam_sort_buffer_size = 32M
join_buffer_size = 1M
read_buffer_size = 2M
sort_buffer_size = 4M
table_cache = 1536
thread_cache = 8
thread_concurrency = 4
thread_cache_size = 256
wait_timeout = 600
connect_timeout = 10
max_tmp_tables = 256
tmp_table_size = 64M
max_allowed_packet = 16M
max_connect_errors = 10
query_cache_limit = 1M
query_cache_size = 32M
query_cache_type = 1
query_prealloc_size = 16384
query_alloc_block_size = 16384
log_slow_queries
log_queries_not_using_indexes

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
open_files_limit = 8192</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.icez.net/blog/38/mysql-mycnf/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>0021 &#124; วิธีนับจำนวนแถว (record) ในตาราง</title>
		<link>http://www.icez.net/blog/25/%e0%b8%a7%e0%b8%b4%e0%b8%98%e0%b8%b5%e0%b8%99%e0%b8%b1%e0%b8%9a%e0%b8%88%e0%b8%b3%e0%b8%99%e0%b8%a7%e0%b8%99%e0%b9%81%e0%b8%96%e0%b8%a7-record-%e0%b9%83%e0%b8%99%e0%b8%95%e0%b8%b2%e0%b8%a3%e0%b8%b2</link>
		<comments>http://www.icez.net/blog/25/%e0%b8%a7%e0%b8%b4%e0%b8%98%e0%b8%b5%e0%b8%99%e0%b8%b1%e0%b8%9a%e0%b8%88%e0%b8%b3%e0%b8%99%e0%b8%a7%e0%b8%99%e0%b9%81%e0%b8%96%e0%b8%a7-record-%e0%b9%83%e0%b8%99%e0%b8%95%e0%b8%b2%e0%b8%a3%e0%b8%b2#comments</comments>
		<pubDate>Sun, 15 Jun 2008 08:02:57 +0000</pubDate>
		<dc:creator>icez</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[PHP Coding]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[optimize]]></category>
		<category><![CDATA[query]]></category>

		<guid isPermaLink="false">http://www.icez.net/blog/?p=25</guid>
		<description><![CDATA[ดองไว้นานเชียะ = =&#8217; ขออภัยด้วยครับ แบบว่าขี้เกียจเขียน เอ้ย งานยุ่งๆ มหาลัยเปิดเทอมแล้ว ตารางเรียนเห็นแล้วแทบบ้า เอาวันหยุดของตูคืนมา เอาวันหยุดของตูคืนมา T_T เข้าประเด็นเลยดีกว่า ช่วงนี้มีงานประเภทนี้เยอะครับ เห็นแล้วก็เซ็งไอ้คนเขียนเว็บคนเก่าที่ทำระบบมาจริงๆ คุณพี่เขียนไว้อย่างนี้ครับ&#8230;. $sql = mysql_query&#40;&#34;SELECT * FROM table&#34;&#41;; $records = mysql_num_rows&#40;$sql&#41;; ไอ้อันที่จริงมันก็ไม่ผิดอะไรหรอกครับถ้าจะใช้แบบนี้ เพราะ code มันก็ทำงานได้ปกติสุขดีของมัน แต่&#8230; ใครจะรู้มั้ยครับ ว่า mysql มันต้องส่งข้อมูลมากขนาดไหน สมมติว่า ตารางมีขนาด 1 MB การ query นี้จะทำให้ mysql ต้องส่งข้อมูลขนาด 1 MB ให้ client ที่ทำการ query แล้ว client จะเป็นผู้นับจำนวนแถวเอง ลองคิดดูว่าถ้าตารางเราเกิดมีขนาด 10 MB [...]]]></description>
			<content:encoded><![CDATA[<p>ดองไว้นานเชียะ = =&#8217;<br />
ขออภัยด้วยครับ แบบว่าขี้เกียจเขียน เอ้ย งานยุ่งๆ<br />
มหาลัยเปิดเทอมแล้ว ตารางเรียนเห็นแล้วแทบบ้า<br />
เอาวันหยุดของตูคืนมา เอาวันหยุดของตูคืนมา T_T</p>
<p>เข้าประเด็นเลยดีกว่า</p>
<p>ช่วงนี้มีงานประเภทนี้เยอะครับ เห็นแล้วก็เซ็งไอ้คนเขียนเว็บคนเก่าที่ทำระบบมาจริงๆ<br />
คุณพี่เขียนไว้อย่างนี้ครับ&#8230;.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT * FROM table&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$records</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_num_rows</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>ไอ้อันที่จริงมันก็ไม่ผิดอะไรหรอกครับถ้าจะใช้แบบนี้ เพราะ code มันก็ทำงานได้ปกติสุขดีของมัน<br />
แต่&#8230; ใครจะรู้มั้ยครับ ว่า mysql มันต้องส่งข้อมูลมากขนาดไหน</p>
<p>สมมติว่า ตารางมีขนาด 1 MB<br />
การ query นี้จะทำให้ mysql ต้องส่งข้อมูลขนาด 1 MB ให้ client ที่ทำการ query<br />
แล้ว client จะเป็นผู้นับจำนวนแถวเอง<br />
ลองคิดดูว่าถ้าตารางเราเกิดมีขนาด 10 MB หรือมีคนเข้าเยอะๆ นะครับ<br />
สมมติ ตารางเดิม ขนาด 1 MB<br />
แต่คนเข้า &#8220;แค่&#8221; นาทีละ 60 ครั้ง (ตกวินาทีละ 1 ครั้ง)<br />
เท่ากับ Database Server ต้องส่งข้อมูลให้ client ถึงวินาทีละ 1 MB<br />
&#8230;<br />
ถ้าขนาดฐานข้อมูลใหญ่ขึ้น<br />
ถ้าคนเข้าเยอะขึ้น&#8230; ลองคิดดูครับว่ามันจะเปลืองทรัพยากรระบบขนาดไหน</p>
<p>วิธีนับจำนวน record จริงๆ ที่ใช้กันทั่วไปในระบบใหญ่ๆ เค้าใช้กันแบบนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT COUNT(*) FROM table&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$res</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$records</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$res</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>

<p>จำนวนบรรทัดเยอะขึ้น 1 บรรทัด แต่การทำงานลดลงฮวบฮาบผิดกันลิบๆ</p>
<p>* คำสั่ง SELECT COUNT(*) ห้ามเอาไปใช้กับตารางประเภท InnoDB โดยเด็ดขาดนะครับ<br />
มิเช่นนั้น database server อาจน็อคเอาได้ง่ายๆ</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icez.net/blog/25/%e0%b8%a7%e0%b8%b4%e0%b8%98%e0%b8%b5%e0%b8%99%e0%b8%b1%e0%b8%9a%e0%b8%88%e0%b8%b3%e0%b8%99%e0%b8%a7%e0%b8%99%e0%b9%81%e0%b8%96%e0%b8%a7-record-%e0%b9%83%e0%b8%99%e0%b8%95%e0%b8%b2%e0%b8%a3%e0%b8%b2/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>0019 &#124; สารบัญนั้นสำคัญไฉน&#8230; (ว่าด้วย MySQL Index)</title>
		<link>http://www.icez.net/blog/23/%e0%b8%aa%e0%b8%b2%e0%b8%a3%e0%b8%9a%e0%b8%b1%e0%b8%8d%e0%b8%99%e0%b8%b1%e0%b9%89%e0%b8%99%e0%b8%aa%e0%b8%b3%e0%b8%84%e0%b8%b1%e0%b8%8d%e0%b9%84%e0%b8%89%e0%b8%99</link>
		<comments>http://www.icez.net/blog/23/%e0%b8%aa%e0%b8%b2%e0%b8%a3%e0%b8%9a%e0%b8%b1%e0%b8%8d%e0%b8%99%e0%b8%b1%e0%b9%89%e0%b8%99%e0%b8%aa%e0%b8%b3%e0%b8%84%e0%b8%b1%e0%b8%8d%e0%b9%84%e0%b8%89%e0%b8%99#comments</comments>
		<pubDate>Wed, 28 May 2008 11:48:28 +0000</pubDate>
		<dc:creator>icez</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[optimize]]></category>
		<category><![CDATA[query]]></category>

		<guid isPermaLink="false">http://www.icez.net/blog/?p=23</guid>
		<description><![CDATA[ดองไว้ตั้งนานแล้วครับ entry นี้ เคยเกริ่นๆ ไว้ตั้งนานแล้วด้วยแหละ เรื่องนี้ถือเป็นเรื่องใหญ่มากๆ ครับในการออกแบบฐานข้อมูลบน MySQL เนื่องด้วยมันจะมีผลต่อความเร็วในการค้นหาข้อมูลมาก ถึงมากที่สุด เคสที่ยังใช้งานน้อยๆ เช่นมีการเรียกใช้แค่ นาทีละไม่ถึงสามสิบครั้ง อะไรอย่างนี้อาจจะไม่ค่อยเห็นผลเท่าไหร่ แต่พอมีการใช้งานเยอะๆ ดูสิครับ&#8230; ไม่อยากบรรยายถึงความเละสุดอนาถเลยแหละ ทีนี้ จะดูยังไงว่าเราควรจะสร้างฐานข้อมูลยังไง ออกแบบยังไงให้มีประสิทธิภาพ ตรงนี้ต้องดูการเรียกใช้งานของเราครับ เช่น&#8230; อ้อ ลืมไป ยกตัวอย่างไม่ได้ ต้องสร้างตารางก่อน CREATE TABLE users &#40; id INT NOT NULL DEFAULT '0' AUTO_INCREMENT, username VARCHAR&#40;24&#41; NOT NULL DEFAULT '', password VARCHAR&#40;32&#41; NOT NULL DEFAULT '', email VARCHAR&#40;64&#41; NOT NULL DEFAULT '', [...]]]></description>
			<content:encoded><![CDATA[<p>ดองไว้ตั้งนานแล้วครับ entry นี้<br />
เคยเกริ่นๆ ไว้ตั้งนานแล้วด้วยแหละ</p>
<p>เรื่องนี้ถือเป็นเรื่องใหญ่มากๆ ครับในการออกแบบฐานข้อมูลบน MySQL<br />
เนื่องด้วยมันจะมีผลต่อความเร็วในการค้นหาข้อมูลมาก ถึงมากที่สุด<br />
เคสที่ยังใช้งานน้อยๆ เช่นมีการเรียกใช้แค่ นาทีละไม่ถึงสามสิบครั้ง อะไรอย่างนี้อาจจะไม่ค่อยเห็นผลเท่าไหร่<br />
แต่พอมีการใช้งานเยอะๆ ดูสิครับ&#8230; ไม่อยากบรรยายถึงความเละสุดอนาถเลยแหละ</p>
<p>ทีนี้ จะดูยังไงว่าเราควรจะสร้างฐานข้อมูลยังไง ออกแบบยังไงให้มีประสิทธิภาพ<br />
ตรงนี้ต้องดูการเรียกใช้งานของเราครับ เช่น&#8230;</p>
<p>อ้อ ลืมไป ยกตัวอย่างไม่ได้ ต้องสร้างตารางก่อน</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> users <span style="color: #66cc66;">&#40;</span>
    id <span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'0'</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span>
    username <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">24</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
    password <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
    email <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">64</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
    <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span> Engine<span style="color: #66cc66;">=</span>MyISAM;</pre></div></div>

</blockquote>
<p>ในการนี้เราจะได้ตาราง users มี 4 field คือ id, username, password และ email<br />
ทีนี้ สมมติเราต้องการดึงค่า email ออกมาจากตาราง โดยหาจาก username ก็ต้อง query แบบนี้</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> email <span style="color: #993333; font-weight: bold;">FROM</span> users <span style="color: #993333; font-weight: bold;">WHERE</span> username <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'xxxxxxx'</span>;</pre></div></div>

</blockquote>
<p>เงื่อนไขการค้นหาก็จะเป็น ค้นหาจาก ตาราง users โดยดูใน field username ที่มีค่าเท่ากับ &#8216;xxxxxxx&#8217;</p>
<p>กรณีที่เรายังไม่ได้ทำ Index ให้ตารางนี้&#8230;<br />
MySQL จะเปิดตารางขึ้นมา(จาก harddisk) จากนั้นก็เริ่มตั้งแต่ record แรกสุด<br />
เรียกข้อมูลใน field username ออกมาเทียบค่า ถ้าไม่ใช่ก็หาต่อไปเรื่อยๆ จนกว่าจะเจอ<br />
ซึ่งกรณีเลวร้ายที่สุด คือค้นหาไม่เจอเลย จะทำให้ MySQL ต้องทำการอ่านข้อมูลจากตารางเยอะมาก<br />
กลายเป็นว่า ต้องอ่านข้อมูลทั้งตารางเพื่อหาว่า user นี้อยู่ที่ record ไหน</p>
<p>สมมติพอทำ Index ปุ๊ป MySQL ก็จะเข้ามาอ่าน Index ที่มีอยู่<br />
ซึ่งโดยปกติ index จะพยายามเก็บในแรมครับ แต่ก็มี file ที่เก็บบน harddisk เหมือนกัน<br />
แล้วก็เทียบค่าไปเรื่อยๆ แต่แรมมันเร็วกว่า hdd เยอะครับ&#8230;<br />
จากนั้น พอเจอแล้ว เจ้า index นี่ก็จะเป็นตัวบอกว่า ข้อมูลนี้อยู่ที่ตำแหน่งตรงไหนของแฟ้ม<br />
ก็เลยทำให้ MySQL กระโดดไปเอาข้อมูลมาได้เลยครับ</p>
<p>คำสั่งเพิ่ม index ให้ตารางที่มีอยู่แล้วใช้อย่างนี้ครับ</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> users <span style="color: #993333; font-weight: bold;">ADD</span> <span style="color: #993333; font-weight: bold;">INDEX</span> <span style="color: #66cc66;">&#40;</span>username<span style="color: #66cc66;">&#41;</span></pre></div></div>

</blockquote>
<p>.</p>
<p>เดี๋ยวจะมาอธิบายการตรวจสอบ query อีกที ง่วงมากเลยตอนนี้ T_T</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icez.net/blog/23/%e0%b8%aa%e0%b8%b2%e0%b8%a3%e0%b8%9a%e0%b8%b1%e0%b8%8d%e0%b8%99%e0%b8%b1%e0%b9%89%e0%b8%99%e0%b8%aa%e0%b8%b3%e0%b8%84%e0%b8%b1%e0%b8%8d%e0%b9%84%e0%b8%89%e0%b8%99/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>0014 &#124; MySQL Replicate</title>
		<link>http://www.icez.net/blog/18/mysql-replicate</link>
		<comments>http://www.icez.net/blog/18/mysql-replicate#comments</comments>
		<pubDate>Wed, 14 May 2008 06:40:31 +0000</pubDate>
		<dc:creator>icez</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[load balance]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[optimize]]></category>
		<category><![CDATA[postmunlife]]></category>
		<category><![CDATA[replicate]]></category>

		<guid isPermaLink="false">http://www.icez.net/blog/?p=18</guid>
		<description><![CDATA[* บทความนี้อ้างอิงและประยุกต์มาจากเว็บไซต์ต่อไปนี้ DNSThailand.com &#8211; เทคนิคการใช้ Replication ระดับสูงใน MySQL CATTelecom.com &#8211; กิตติชน แม้นสมุทร [ejeepss] » Replicate MySQL 5.x สืบเนื่องจาก entry ที่แล้ว ก็เลยลองไปค้นๆ ข้อมูลเพิ่มเติมดูอีกหน่อยว่าเราลืมอะไรไปบ้าง เพราะนึกได้ว่ายังไม่ได้ลองทำ MySQL Replicate เลย (ฮาๆ) ประเด็นคือไม่รู้ว่ามันช้าที่ฐานข้อมูลรึเปล่า เพราะ debug ไม่เจอสาเหตุ ก็เลยต้องลองทำเท่าที่ทำได้ไปก่อน ขั้นต้นก็ต้องมี server 2 เครื่องขึ้นไปครับ โดยสมมติเครื่องแรก ชื่อ web-slave เครื่องที่สอง ชื่อ db-master ก่อนอื่นมาที่เครื่อง web-slave สั่งติดตั้ง mysql server ตามนี้ครับ * อ้างอิง Fedora 8 ครอบคลุม Fedora 4 [...]]]></description>
			<content:encoded><![CDATA[<p>* บทความนี้อ้างอิงและประยุกต์มาจากเว็บไซต์ต่อไปนี้<br />
DNSThailand.com &#8211;  				<a href="http://www.dnsthailand.net/index.php?option=com_content&amp;task=view&amp;id=105&amp;Itemid=36">เทคนิคการใช้ Replication ระดับสูงใน MySQL</a><br />
CATTelecom.com &#8211; <a href="http://catadmin.cattelecom.com/km/blog/kittichonm/category/step-by-step/replicate-mysql-5x/" target="_blank">กิตติชน แม้นสมุทร [ejeepss] » Replicate MySQL 5.x</a></p>
<p>สืบเนื่องจาก entry ที่แล้ว<br />
ก็เลยลองไปค้นๆ ข้อมูลเพิ่มเติมดูอีกหน่อยว่าเราลืมอะไรไปบ้าง<br />
เพราะนึกได้ว่ายังไม่ได้ลองทำ MySQL Replicate เลย (ฮาๆ)<br />
ประเด็นคือไม่รู้ว่ามันช้าที่ฐานข้อมูลรึเปล่า เพราะ debug ไม่เจอสาเหตุ<br />
ก็เลยต้องลองทำเท่าที่ทำได้ไปก่อน</p>
<p>ขั้นต้นก็ต้องมี server 2 เครื่องขึ้นไปครับ<br />
โดยสมมติเครื่องแรก ชื่อ web-slave<br />
เครื่องที่สอง ชื่อ db-master</p>
<p>ก่อนอื่นมาที่เครื่อง web-slave สั่งติดตั้ง mysql server ตามนี้ครับ<br />
* อ้างอิง Fedora 8 ครอบคลุม Fedora 4 &#8211; 9, CentOS 5.x รวมถึงสาย Redhat ทั้งหมดครับ</p>
<blockquote><p># yum install mysql-server</p></blockquote>
<p>เสร็จแล้วเปิดแฟ้ม /etc/my.cnf เพิ่มเติมข้อมูลต่อไปนี้ครับ</p>
<blockquote><p>server-id=2<br />
master-host=<span style="color: #<a href="http://search.twitter.com/search?q=%230000ff" rel="nofollow" target="_blank" title="Search Twitter for &quot;0000ff&quot;">0000ff</a>;">10.0.0.2</span><br />
master-port=3306<br />
master-user=<span style="color: #<a href="http://search.twitter.com/search?q=%23ff0000" rel="nofollow" target="_blank" title="Search Twitter for &quot;ff0000&quot;">ff0000</a>;">replicate</span><br />
master-password=<span style="color: #<a href="http://search.twitter.com/search?q=%23ff0000" rel="nofollow" target="_blank" title="Search Twitter for &quot;ff0000&quot;">ff0000</a>;">slavepassword</span><br />
master-connect-retry=30<br />
replicate-wild-do-table= %.%<br />
report-host=<span style="color: #<a href="http://search.twitter.com/search?q=%23008000" rel="nofollow" target="_blank" title="Search Twitter for &quot;008000&quot;">008000</a>;">10.0.0.1</span></p></blockquote>
<p>(มันมาอีกละ สีฟ้าแดงเขียวนี่)<br />
แก้ ip อะไรพวกนี้ให้ถูกนะครับ แล้วแก้ตัวแดงๆ ด้วย ตามที่ตั้งค่า</p>
<p>เครื่องนี้เสร็จและ กลับไปที่เครื่อง db-master ต่อ ก่อนอื่นต้องตั้งค่า username / password ก่อนครับ<br />
โดยเข้าไปใน mysql query console (หรือที่ไหนก็ได้ที่สามารถตั้ง user ได้) แล้วรัน query ต่อไปนี้</p>
<blockquote><p>mysql&gt; GRANT REPLICATION SLAVE ON *.*<br />
TO &#8216;<span style="color: #<a href="http://search.twitter.com/search?q=%23ff0000" rel="nofollow" target="_blank" title="Search Twitter for &quot;ff0000&quot;">ff0000</a>;">replicate</span>&#8216;@&#8217;<span style="color: #<a href="http://search.twitter.com/search?q=%23008000" rel="nofollow" target="_blank" title="Search Twitter for &quot;008000&quot;">008000</a>;">10.0.0.1</span>&#8216; IDENTIFIED BY &#8216;<span style="color: #<a href="http://search.twitter.com/search?q=%23ff0000" rel="nofollow" target="_blank" title="Search Twitter for &quot;ff0000&quot;">ff0000</a>;">slavepassword</span>&#8216;;</p></blockquote>
<p>เสร็จแล้วออกมาสั่ง stop service mysql ได้เลยครับ แล้วก็แก้แฟ้ม /etc/my.cnf อีกนิดหน่อย ตามนี้ครับ</p>
<blockquote><p>log-bin=<span style="color: #<a href="http://search.twitter.com/search?q=%23ff00ff" rel="nofollow" target="_blank" title="Search Twitter for &quot;ff00ff&quot;">ff00ff</a>;">mysql-bin</span><br />
server-id=1<br />
innodb_flush_log_at_trx_commit=1<br />
sync_binlog=1<br />
expire_logs_days=<span style="color: #<a href="http://search.twitter.com/search?q=%23ff00ff" rel="nofollow" target="_blank" title="Search Twitter for &quot;ff00ff&quot;">ff00ff</a>;">3</span><br />
max_binlog_size=<span style="color: #<a href="http://search.twitter.com/search?q=%23ff00ff" rel="nofollow" target="_blank" title="Search Twitter for &quot;ff00ff&quot;">ff00ff</a>;">50M</span></p></blockquote>
<p>ตรงนี้ปรับค่าตามความเหมาะสมนะครับ แล้วแต่ว่าจะเก็บ log กี่วันยังไง<br />
โดยบรรทัดแรกสุดจะเป็น path + ชื่อแฟ้มที่ใช้เก็บ log (สามารถใส่ full path ได้ครับ เช่น /var/log/mysqld/binlog)<br />
แล้วก็ย้ำว่าควรจะใส่ option สองบรรทัดด้านล่าง เพื่อป้องกัน hdd เต็ม (ฮา)<br />
เคยเจอมาแล้วครับ เก็บ log เพลินไปหน่อย เศร้าเลย</p>
<p>ต่อจากนี้ก็ copy ข้อมูลจาก db-master ไปยังเครื่อง web-slave ครับ<br />
ถ้าใน fedora/centos default install ก็อยู่ใน /var/lib/mysql<br />
สั่ง tar ไปทั้ง folder เลยก็ยังไหวครับ (แต่ข้อแม้คือต้องเป็น mysql version เดียวกันนะ)</p>
<p>จากนั้นก็สั่ง service mysqld start ทั้งสองเครื่อง<br />
แล้ว connect เข้า mysql ของเครื่อง db-master สั่ง query ต่อไปนี้ครับ</p>
<blockquote><p>mysql&gt; FLUSH TABLES WITH READ LOCK;</p></blockquote>
<p>แล้วก็ connect เข้า mysql ของเครื่อง web-slave สั่ง query ต่อไปนี้ครับ</p>
<blockquote><p>mysql&gt; START SLAVE;</p></blockquote>
<p>เท่านี้ก็เรียบร้อย ทีนี้ก็รอดูผลงาน&#8230; ถ้าเวิร์กจะเอาไปใส่เว็บ bitthai ด้วย (ฮาๆ)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icez.net/blog/18/mysql-replicate/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>0013 &#124; เว็บโหด โคตรสยอง</title>
		<link>http://www.icez.net/blog/17/%e0%b9%80%e0%b8%a7%e0%b9%87%e0%b8%9a%e0%b9%82%e0%b8%ab%e0%b8%94-%e0%b9%82%e0%b8%84%e0%b8%95%e0%b8%a3%e0%b8%aa%e0%b8%a2%e0%b8%ad%e0%b8%87</link>
		<comments>http://www.icez.net/blog/17/%e0%b9%80%e0%b8%a7%e0%b9%87%e0%b8%9a%e0%b9%82%e0%b8%ab%e0%b8%94-%e0%b9%82%e0%b8%84%e0%b8%95%e0%b8%a3%e0%b8%aa%e0%b8%a2%e0%b8%ad%e0%b8%87#comments</comments>
		<pubDate>Tue, 13 May 2008 20:49:23 +0000</pubDate>
		<dc:creator>icez</dc:creator>
				<category><![CDATA[Web Server]]></category>
		<category><![CDATA[load balance]]></category>
		<category><![CDATA[nfs]]></category>
		<category><![CDATA[optimize]]></category>
		<category><![CDATA[postmunlife]]></category>

		<guid isPermaLink="false">http://www.icez.net/blog/?p=17</guid>
		<description><![CDATA[เมื่อวานงานเข้าครับ ติดตั้งระบบใหม่ทั้งเครื่อง เว็บบอร์ดใต้ดินแห่งหนึ่ง เนื่องด้วยคนเข้าเยอะชิบหาย แถมเป็นเว็บบอร์ด SMF ซะด้วย โจทย์มีมาให้ค่อนข้าง&#8230; เอ่อ&#8230; ระดับนึงละครับ server 2 เครื่อง เครื่องแรก Core 2 Duo E6600 / RAM 3 GB เครื่องที่สอง Core 2 Quad Q6xxx อะไรซักอย่าง จำรุ่นไม่ได้ / RAM 3GB จะบอกว่ามันใช้งานหนักเอามากๆ งานนี้ก็เลยต้องทดลองมันสารพัดวิธีเลยครับ เริ่มจาก level แรกสุด apache + squid reverse proxy ไม่ผ่านเลยครับ (load avg 50.xx) level ที่สอง เพิ่ม DNS Round Robin เข้าช่วย เอาเครื่อง DB [...]]]></description>
			<content:encoded><![CDATA[<p>เมื่อวานงานเข้าครับ<br />
ติดตั้งระบบใหม่ทั้งเครื่อง เว็บบอร์ดใต้ดินแห่งหนึ่ง<br />
เนื่องด้วยคนเข้าเยอะชิบหาย แถมเป็นเว็บบอร์ด SMF ซะด้วย</p>
<p>โจทย์มีมาให้ค่อนข้าง&#8230; เอ่อ&#8230; ระดับนึงละครับ<br />
server 2 เครื่อง เครื่องแรก Core 2 Duo E6600 / RAM 3 GB<br />
เครื่องที่สอง Core 2 Quad Q6xxx อะไรซักอย่าง จำรุ่นไม่ได้ / RAM 3GB</p>
<p>จะบอกว่ามันใช้งานหนักเอามากๆ<br />
งานนี้ก็เลยต้องทดลองมันสารพัดวิธีเลยครับ</p>
<p>เริ่มจาก level แรกสุด apache + squid reverse proxy ไม่ผ่านเลยครับ (load avg 50.xx)<br />
level ที่สอง เพิ่ม DNS Round Robin เข้าช่วย เอาเครื่อง DB มาช่วยรันเว็บด้วย ก็ยังไม่ผ่าน แต่ดีขึ้นหน่อยนึง (load เหลือ 30.xx)<br />
level ที่สาม ลง memcache ช่วยระบบ session + SMF memcache ก็ไม่ผ่านอยู่ดี แต่ดีขึ้นใช้ได้ (load เหลือ ~25.xx)</p>
<p>level สุดท้าย เลิกใช้ apache ลบ squid ทิ้ง แล้วลง lighttpd 1.4 + mod fastcgi แทน<br />
load average ลดลงมาเหลือประมาณ 5-6 แต่ page generation time ก็ยังไม่ค่อยจะน่าพอใจ<br />
แบบว่าหน้า index พี่ซัดไป 300 KB เยอะโคดเลย</p>
<p>งานนี้ขอเวลาไปสัปดาห์นึง ต้องนั่งเฝ้าอีก เห้อ&#8230; ไหนจะงานรับน้องด้วย งิดๆๆๆ</p>
<p>เพิ่มเติมทางเทคนิค:</p>
<p>NFS service บน Fedora 7 เป็นต้นมา มีการเปลี่ยนแปลงชื่อ service นิดๆ หน่อยๆ<br />
ทำเอางงกันใช้ได้ (ฮาๆ) ตามรายการต่อไปนี้ครับ</p>
<ul>
<li>nfs ยังคงสภาพเดิม คำสั่งเดิมได้เลย</li>
<li>portmap เปลี่ยนชื่อไปเป็น rpcbind</li>
<li>เพิ่มเติม service nfslock ไว้ทำ nfs remote lock เวลาต้องการ lock access file ต่างๆ</li>
</ul>
<p>ขั้นตอนการติดตั้ง nfs บน Fedora 8 ง่ายมากจนน่าตกใจ ดังนี้ครับ</p>
<blockquote><p># yum install nfs-utils</p></blockquote>
<p>จบเลย คำสั่งเดียวสั้นๆ ง่ายๆ เลย<br />
เสร็จแล้วก็ตั้งค่าให้รันตั้งแต่เริ่มเปิดเครื่อง (สำหรับเครื่อง nfs server เท่านั้น)</p>
<blockquote><p># chkconfig nfs on<br />
# chkconfig nfslock on<br />
# chkconfig rpcbind on</p></blockquote>
<p>แล้วแก้แฟ้ม /etc/exports ตามคู่มือ (รายละเอียดค่อนข้างเยอะ ไว้ค่อยสาธยาย ง่วงมาก)<br />
พร้อมด้วยการแก้ /etc/hosts.allow เพื่อเพิ่มความปลอดภัยให้แก่ nfs server<br />
แก้เสร็จแล้วก็สั่ง start service ทั้งสามตัวได้เลย ตามลำดับต่อไปนี้</p>
<blockquote><p># service rpcbind start<br />
# service nfs start<br />
# service nfslock start</p></blockquote>
<p>จากนั้นไปที่เครื่อง client ที่จะ mount nfs partition แล้วทดลองสั่งค้นหา partition ที่อนุญาตให้ mount ดู ตามนี้</p>
<blockquote><p># showmount -e <span style="color: #<a href="http://search.twitter.com/search?q=%23ff6600" rel="nofollow" target="_blank" title="Search Twitter for &quot;ff6600&quot;">ff6600</a>;">10.0.0.1</span></p></blockquote>
<p>* กรุณาแก้ IP เป็น IP ของเครื่อง nfs server ของท่านครับ พอ list ได้ที่แล้วก็สั่ง mount ได้เลย</p>
<blockquote><p># mount <span style="color: #<a href="http://search.twitter.com/search?q=%23ff0000" rel="nofollow" target="_blank" title="Search Twitter for &quot;ff0000&quot;">ff0000</a>;">10.0.0.1</span>:<span style="color: #<a href="http://search.twitter.com/search?q=%23339966" rel="nofollow" target="_blank" title="Search Twitter for &quot;339966&quot;">339966</a>;">/path/to/exports</span> <span style="color: #<a href="http://search.twitter.com/search?q=%230000ff" rel="nofollow" target="_blank" title="Search Twitter for &quot;0000ff&quot;">0000ff</a>;">/path/to/exports</span></p></blockquote>
<p>กรณีการทำ load balancing แนะนำให้ mount ลงไปที่ path เดียวกันกับเครื่อง server ครับ<br />
จะช่วยลดปัญหายุ่งยากลงได้เยอะ</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icez.net/blog/17/%e0%b9%80%e0%b8%a7%e0%b9%87%e0%b8%9a%e0%b9%82%e0%b8%ab%e0%b8%94-%e0%b9%82%e0%b8%84%e0%b8%95%e0%b8%a3%e0%b8%aa%e0%b8%a2%e0%b8%ad%e0%b8%87/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>0010 &#124; MySQL Memory Engine</title>
		<link>http://www.icez.net/blog/13/mysql-memory-engine</link>
		<comments>http://www.icez.net/blog/13/mysql-memory-engine#comments</comments>
		<pubDate>Fri, 09 May 2008 19:05:35 +0000</pubDate>
		<dc:creator>icez</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[optimize]]></category>

		<guid isPermaLink="false">http://www.icez.net/blog/?p=13</guid>
		<description><![CDATA[ก่อนอื่นขอรายงานสถานการณ์+บ่นซะก่อน แง่มๆ วันที่ 7 ตอน 22.00 น. ไฟฟ้าใช้ได้ตามปกติแล้วครับ แล้วก็&#8230; aircard กลับมาใช้ได้ตามปกติแล้ว เย้ๆๆ เซ็งแทบตาย ต้องไปจิ้มสายเน็ตเพื่อนใช้อยู่ แล้วมันเร็ว เอ้ย แล้วมันต้องเกรงใจอะ น่าเบื่อที่สุด ทำอะไรไม่สะใจเลย กลับเข้าเรื่องกันดีกว่า วันนี้จะมาว่าด้วย MySQL Memory Engine ครับ Memory Engine เป็นรูปแบบตารางของ MySQL แบบหนึ่ง ซึ่งมีโครงสร้างคล้ายๆ กับ MyISAM บ้าง นิดๆ หน่อยๆ เพียงแต่แทนที่จะเก็บไว้เป็นไฟล์ .MYD ไว้บนเครื่อง ก็เปลี่ยนมาเป็น เก็บลง shared memory ของ master process แทน แน่นอนครับ ผลลัพท์ที่ได้มันก็มาจากความเร็วของ RAM ที่ท่านใช้ ว่ามันจะเร็วได้แค่ไหน ซึ่งปกติ ประสิทธิภาพความเร็วที่ทำได้จะอยู่ราวๆ 50-150 [...]]]></description>
			<content:encoded><![CDATA[<p>ก่อนอื่นขอรายงานสถานการณ์+บ่นซะก่อน แง่มๆ<br />
วันที่ 7 ตอน 22.00 น. ไฟฟ้าใช้ได้ตามปกติแล้วครับ<br />
แล้วก็&#8230; aircard กลับมาใช้ได้ตามปกติแล้ว เย้ๆๆ<br />
เซ็งแทบตาย ต้องไปจิ้มสายเน็ตเพื่อนใช้อยู่ แล้วมันเร็ว<br />
เอ้ย แล้วมันต้องเกรงใจอะ น่าเบื่อที่สุด ทำอะไรไม่สะใจเลย</p>
<p>กลับเข้าเรื่องกันดีกว่า<br />
วันนี้จะมาว่าด้วย MySQL Memory Engine ครับ</p>
<p>Memory Engine เป็นรูปแบบตารางของ MySQL แบบหนึ่ง<br />
ซึ่งมีโครงสร้างคล้ายๆ กับ MyISAM บ้าง นิดๆ หน่อยๆ<br />
เพียงแต่แทนที่จะเก็บไว้เป็นไฟล์ .MYD ไว้บนเครื่อง ก็เปลี่ยนมาเป็น<br />
เก็บลง shared memory ของ master process แทน<br />
แน่นอนครับ ผลลัพท์ที่ได้มันก็มาจากความเร็วของ RAM ที่ท่านใช้<br />
ว่ามันจะเร็วได้แค่ไหน ซึ่งปกติ ประสิทธิภาพความเร็วที่ทำได้จะอยู่ราวๆ <span style="color: #<a href="http://search.twitter.com/search?q=%230000ff" rel="nofollow" target="_blank" title="Search Twitter for &quot;0000ff&quot;">0000ff</a>;">50-150 เท่า</span>ของ MyISAM ครับ</p>
<p>อ๊ะๆ เห็นมันเร็วกันบ้าพลังขนาดนี้นี่ อย่ามาคิดเชียวว่าทำไมไม่เก็บไว้ใน Memory ให้หมด<br />
สาเหตุมันก็เพราะปัจจัยตามนี้ครับ</p>
<ol>
<li>เครื่องมีแรมเท่าไหร่ มันก็เก็บได้ไม่เกิน 1/2 ของแรมนั่นแหละครับ</li>
<li>ใช้ field ประเภท text/blob ทุกชนิดไม่ได้ (ใช้ varchar ได้อยู่นะครับ)</li>
<li>restart mysql ปุ๊ป ข้อมูลหายเรียบ (ก็มันเก็บในแรมนี่)</li>
<li>เปลืองพื้นที่มากกว่า MyISAM เยอะ (ตาราง MyISAM ขนาด 10 MB เวลาแปลงเป็น Memory จะใช้แรมประมาณ 40 MB)</li>
<li>ต้อง allocate memory เป็น block แต่ละ block ขนาดประมาณ 4-8 MB (เอาเป็นว่าหารเลขฐานสองลงตัวอะ)</li>
</ol>
<p>ว่าแต่ร่ายซะเสียเลยแฮะเรา (ฮาๆ)<br />
เอาเป็นว่า เนื่องด้วยเหตุผลข้อ 3 ทำให้เราไม่สามารถเก็บข้อมูลลงใน Memory Engine ได้ถาวรแน่นอนครับ<br />
ดังนั้น ตารางแบบนี้เหมาะสำหรับเก็บค่า &#8220;ชั่วคราว&#8221; มากกว่า<br />
เช่นพวกสถิติ user online, session ของเว็บไซต์ อะไรพวกนี้<br />
ซึ่งวิธีแปลงก็ง่ายๆ ครับ</p>
<blockquote><p>ALTER TABLE <span style="color: #<a href="http://search.twitter.com/search?q=%230000ff" rel="nofollow" target="_blank" title="Search Twitter for &quot;0000ff&quot;">0000ff</a>;">table</span> ENGINE=Memory;</p></blockquote>
<p>แค่นี้เอง สั้นๆ ง่ายๆ ได้ใจความ<br />
รูปแบบการใช้งานที่เหมาะสม (และผมใช้อยู่ปัจจุบัน)คือ ตาราง peers ของเว็บ bittorrent ครับ<br />
reset ไปมันก็เข้าใหม่ได้ ไม่มีปัญหาอะไรมาก แถมตารางนี้ access หนักมาก ถี่ยิบๆ<br />
ก็เลยเหมาะต่อการใช้ Memory Engine ที่สุดเลย</p>
<p>รองลงมาก็คือ download session ของเว็บฝากไฟล์<br />
พวกนี้ปล่อยๆ มันได้ครับ ใช้ไม่่ค่อยเยอะหรอก</p>
<p>ทีนี้ ปัญหาที่จะเจอคือ Error ต่อไปนี้</p>
<blockquote><p>The table &#8216;<span style="color: #<a href="http://search.twitter.com/search?q=%23ff0000" rel="nofollow" target="_blank" title="Search Twitter for &quot;ff0000&quot;">ff0000</a>;">table</span>&#8216; is full</p></blockquote>
<p>ทั้งนี้เนื่องมาจาก MySQL มีการกำหนดขนาดสูงสุดของตารางประเภท Memory ไว้ครับ<br />
ว่า 1 ตารางสามารถจุข้อมูลได้ทั้งหมดกี่ MB ใน variable ที่ชื่อ <span style="color: #<a href="http://search.twitter.com/search?q=%230000ff" rel="nofollow" target="_blank" title="Search Twitter for &quot;0000ff&quot;">0000ff</a>;">max_heap_table_size</span> ครับ<br />
โดยค่าปกติของ MySQL 5.0 คือ 16 MB<br />
อยากให้มันใหญ่ได้เท่าไหร่ก็ใส่ไปโลด /etc/my.cnf ในส่วนของ mysqld สั้นๆ ง่ายๆ ครับ</p>
<p>จบและ คราวหน้าถ้าไม่ลืมจะมาพูดถึง MySQL Indexes ครับ</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icez.net/blog/13/mysql-memory-engine/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>0008 &#124; Final Score ภาค 3</title>
		<link>http://www.icez.net/blog/11/final-score-%e0%b8%a0%e0%b8%b2%e0%b8%84-3</link>
		<comments>http://www.icez.net/blog/11/final-score-%e0%b8%a0%e0%b8%b2%e0%b8%84-3#comments</comments>
		<pubDate>Sun, 04 May 2008 17:42:21 +0000</pubDate>
		<dc:creator>icez</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[IP Network]]></category>
		<category><![CDATA[admission]]></category>
		<category><![CDATA[bandwidth]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[load balance]]></category>
		<category><![CDATA[optimize]]></category>

		<guid isPermaLink="false">http://www.icez.net/blog/?p=11</guid>
		<description><![CDATA[อ้างอิงจาก Entry ที่แล้ว (เตรียมรับมือประกาศผล admission) และแล้วก็ผ่านพ้นกันไปเป็นที่เรียบร้อยสำหรับการประกาศผล admission 2551 ซึ่งผมก็ได้ไปร่วม ในฐานะเบื้องหลังของเว็บไซต์ http://admissions.bodinzone.com/ (อีกครั้ง) สรุปคร่าวๆ ก็&#8230; งานนี้ทีแรกนึกว่าจะหินมากกว่านี้ครับ แต่เจอเข้าไป &#8220;แค่&#8221; 20 คำร้องต่อวินาที (ย้ำว่าไอ้ 20 req/sec นี่ &#8220;แค่&#8221; จริงๆ สำหรับผม) มาดูสถิติกันดีกว่าครับ กราฟ CPU ไม่มีอะไรเปลี่ยนแปลง ขี้เกียจ cap ขอผ่านละกัน เอาที่น่าสนใจหน่อย กราฟ connection คงค้างในเซิฟเวอร์ครับ ตั้งแต่เริ่มประกาศ คือก่อนเวลาประมาณ 18.00 น. นิดหน่อย มาจนถึงปัจจุบัน ก็ยังมีการเรียกใช้งานอยู่เรื่อยๆ เห็นได้จากที่มีกราฟพุ่งปรี๊ดไปพอประมาณ สรุปเทคนิค optimize ที่ใช้ DNS Round Robin MySQL Indexes MySQL Memory [...]]]></description>
			<content:encoded><![CDATA[<p>อ้างอิงจาก Entry ที่แล้ว (<a href="http://www.icez.net/blog/8/%E0%B9%80%E0%B8%95%E0%B8%A3%E0%B8%B5%E0%B8%A2%E0%B8%A1%E0%B8%A3%E0%B8%B1%E0%B8%9A%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%81%E0%B8%B2%E0%B8%A8%E0%B8%9C%E0%B8%A5-admission" target="_blank">เตรียมรับมือประกาศผล admission</a>)</p>
<p>และแล้วก็ผ่านพ้นกันไปเป็นที่เรียบร้อยสำหรับการประกาศผล admission 2551<br />
ซึ่งผมก็ได้ไปร่วม ในฐานะเบื้องหลังของเว็บไซต์ <a href="http://admissions.bodinzone.com/">http://admissions.bodinzone.com/</a> (อีกครั้ง)</p>
<p><img src="http://img.thzhost.com/i/7g/twh6c.png" alt="" width="366" height="242" /></p>
<p>สรุปคร่าวๆ ก็&#8230;<br />
งานนี้ทีแรกนึกว่าจะหินมากกว่านี้ครับ<br />
แต่เจอเข้าไป &#8220;แค่&#8221; 20 คำร้องต่อวินาที<br />
(ย้ำว่าไอ้ 20 req/sec นี่ &#8220;แค่&#8221; จริงๆ สำหรับผม)</p>
<p>มาดูสถิติกันดีกว่าครับ<br />
กราฟ CPU ไม่มีอะไรเปลี่ยนแปลง ขี้เกียจ cap ขอผ่านละกัน<br />
เอาที่น่าสนใจหน่อย</p>
<p><img src="http://img.thzhost.com/i/q9/4ar1c.png" alt="" width="523" height="179" /></p>
<p>กราฟ connection คงค้างในเซิฟเวอร์ครับ<br />
ตั้งแต่เริ่มประกาศ คือก่อนเวลาประมาณ 18.00 น. นิดหน่อย มาจนถึงปัจจุบัน<br />
ก็ยังมีการเรียกใช้งานอยู่เรื่อยๆ เห็นได้จากที่มีกราฟพุ่งปรี๊ดไปพอประมาณ</p>
<p>สรุปเทคนิค optimize ที่ใช้</p>
<ol>
<li><a href="http://www.icez.net/blog/5/dns-round-robin">DNS Round Robin</a></li>
<li>MySQL Indexes</li>
<li>MySQL Memory Engine</li>
</ol>
<p>เอาไว้เดี๋ยวค่อยเขียนรายละเอียดของข้อ 2-3 ละกัน<br />
จะได้ดูแล้วมีเนื้อหาเยอะๆ หน่อย blog นี้ (ฮา)</p>
<p>ว่าแต่ น้องๆ ทุกคนเป็นไงกันมั่งครับ<br />
หวังว่าคงได้คณะที่อยากได้กันนะครับ ^^</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icez.net/blog/11/final-score-%e0%b8%a0%e0%b8%b2%e0%b8%84-3/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>0007 &#124; gzip compression กับการใช้งาน CPU</title>
		<link>http://www.icez.net/blog/10/gzip-compression-%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b8%87%e0%b8%b2%e0%b8%99-cpu</link>
		<comments>http://www.icez.net/blog/10/gzip-compression-%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b8%87%e0%b8%b2%e0%b8%99-cpu#comments</comments>
		<pubDate>Sat, 03 May 2008 17:39:13 +0000</pubDate>
		<dc:creator>icez</dc:creator>
				<category><![CDATA[IP Network]]></category>
		<category><![CDATA[PHP Coding]]></category>
		<category><![CDATA[Web Server]]></category>
		<category><![CDATA[bandwidth]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[optimize]]></category>

		<guid isPermaLink="false">http://www.icez.net/blog/?p=10</guid>
		<description><![CDATA[จาก entry ที่ 4 (รับมือเว็บ 250 req/sec) บัดนี้ผลการทดลองออกมาแล้วครับ กราฟบน เป็นปริมาณ traffic ส่วนกราฟล่าง เป็นปริมาณการใช้งาน CPU ครับ ด้านการใช้งาน CPU สรุปได้สั้นๆ ง่ายๆ ว่า ไม่ต่าง&#8230; แล้วตูจะปิด gzip ไปทำไมเนี่ย ในเมื่อกราฟบนมันบอกว่า ปิด gzip ไปแล้ว เปลือง bandwidth ขึ้นตั้งสองเท่าแน่ะ สังเกตตรงที่ลูกศรชี้นะครับ ตรงนั้นคือผมสั่งเปิดการทำงานของ gzip compression อีกรอบ แล้วก็ลงมาดูกราฟ CPU ที่ตำแหน่งเดียวกัน ไม่เห็นมันจะเปลือง CPU มากขึ้นเลยซักนิด ว่าแต่งานนี้คงต้อง compile PHP ใหม่ละมั้งนี่ เห้อ&#8230;]]></description>
			<content:encoded><![CDATA[<p>จาก entry ที่ 4 <a title="รับมือเว็บ 250 req/sec" href="http://www.icez.net/blog/6/%e0%b8%a3%e0%b8%b1%e0%b8%9a%e0%b8%a1%e0%b8%b7%e0%b8%ad%e0%b9%80%e0%b8%a7%e0%b9%87%e0%b8%9a-250-reqsec" target="_blank">(รับมือเว็บ 250 req/sec</a>) บัดนี้ผลการทดลองออกมาแล้วครับ</p>
<p><img src="http://img.thzhost.com/i/5u/aoisc.png" alt="" width="525" height="346" /></p>
<p>กราฟบน เป็นปริมาณ traffic<br />
ส่วนกราฟล่าง เป็นปริมาณการใช้งาน CPU ครับ</p>
<p>ด้านการใช้งาน CPU สรุปได้สั้นๆ ง่ายๆ ว่า ไม่ต่าง&#8230;<br />
แล้วตูจะปิด gzip ไปทำไมเนี่ย ในเมื่อกราฟบนมันบอกว่า<br />
ปิด gzip ไปแล้ว เปลือง bandwidth ขึ้นตั้งสองเท่าแน่ะ</p>
<p>สังเกตตรงที่ลูกศรชี้นะครับ ตรงนั้นคือผมสั่งเปิดการทำงานของ gzip compression อีกรอบ<br />
แล้วก็ลงมาดูกราฟ CPU ที่ตำแหน่งเดียวกัน ไม่เห็นมันจะเปลือง CPU มากขึ้นเลยซักนิด</p>
<p>ว่าแต่งานนี้คงต้อง compile PHP ใหม่ละมั้งนี่ เห้อ&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icez.net/blog/10/gzip-compression-%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b8%87%e0%b8%b2%e0%b8%99-cpu/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: www.icez.net @ 2012-02-10 17:46:58 -->
