<?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>Huysuz Adam &#187; MySQL</title>
	<atom:link href="http://www.huysuzadam.com/tag/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.huysuzadam.com</link>
	<description>Web teknolojileri ile ilgili teknik bir blog...</description>
	<lastBuildDate>Fri, 12 Feb 2010 07:24:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MySQL türkçe desteği: Collation ve character set nedir?</title>
		<link>http://www.huysuzadam.com/2009/05/23/mysql-turkce-destegi-collation-ve-character-set-nedir/</link>
		<comments>http://www.huysuzadam.com/2009/05/23/mysql-turkce-destegi-collation-ve-character-set-nedir/#comments</comments>
		<pubDate>Sat, 23 May 2009 10:52:33 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[Genel]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Web Teknolojileri]]></category>

		<guid isPermaLink="false">http://www.huysuzadam.com/?p=252</guid>
		<description><![CDATA[MySQL 4.1&#8242;den itibaren türkçe karakter işi karıştı. &#8220;SET NAMES latin5&#8243; ile çözdük bu problemi gerçi ama yine de sistemin nasıl çalıştığını bilmezseniz sorun yaşayabilirsiniz. O yüzden MySQL&#8217;in karakter seti ve collation hakkında birşeyler yazayım istedim.
Tanımlar
Konuyu kavramak için önce tanımları ele alalım. Bilmemiz gereken iki tanım var: &#8220;Character Set&#8221; ve &#8220;Collation&#8221; 
Character Set (Karakter Seti)
Adından anlayabileceğiniz [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL 4.1&#8242;den itibaren türkçe karakter işi karıştı. &#8220;SET NAMES latin5&#8243; ile çözdük bu problemi gerçi ama yine de sistemin nasıl çalıştığını bilmezseniz sorun yaşayabilirsiniz. O yüzden MySQL&#8217;in karakter seti ve collation hakkında birşeyler yazayım istedim.</p>
<h2>Tanımlar</h2>
<p>Konuyu kavramak için önce tanımları ele alalım. Bilmemiz gereken iki tanım var: &#8220;Character Set&#8221; ve &#8220;Collation&#8221; </p>
<p><strong>Character Set (Karakter Seti)</strong><br />
Adından anlayabileceğiniz gibi desteklenen karakterleri kast ediyoruz. Örneğin latin5 karakter setindeki &#8220;ı&#8221; harfinin ASCII kodu latin1 karakter setindeki &yacute; harfi ile aynıdır. Dolayısıyla türkçe bir dokümanı latin1 olarak gösterirseniz tüm &#8216;ı&#8217; harfleri &#8216;&yacute;&#8217; olarak gösterilecektir.</p>
<p>Farklı diller aynı karakter setlerine sahip olabilir, örneğin latin1 seti almanca, ispanyolca, ingilizce, isveçce gibi dilleri kapsar.</p>
<p><span id="more-252"></span></p>
<p>Notlar:<br />
- Character set, charset, code page gibi isimleri de vardır.<br />
- latin1: ISO-8859-1 ve windows-1252 ile aynıdır.<br />
- latin5: ISO-8859-9 ve windows-1254 ile aynıdır.  </p>
<p><strong>Collation (koleyşın)</strong><br />
İki karakterin karşılaştırılmasında kullanılır. Pratikte bu tablo alanlarını sorgularken ve sıralamalarda işe yarar:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SET</span> names latin5;
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> deneme <span style="color: #993333; font-weight: bold;">WHERE</span> isim <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Çağrı'</span>;
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> deneme <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> isim;</pre></div></div>

<p>Yukarıdaki sorguların sonucu <code>isim</code> alanının collation&#8217;ına bağlıdır.</p>
<p>Örnekle açıklamak istersek, almancada da &#8220;ü&#8221; harfi var türkçede de, isveçcede de&#8230; Ama bu harflerin alfabedeki yeri dile göre değişiyor yani collation&#8217;ı latin1_swedish_ci seçip sıralama yaparsanız ü başka yerde, latin1_german1_ci seçerseniz başka yerde yer alır. Ya da latin1_german1_ci seçerseniz aramalarda &#8216;ä&#8217; ile &#8216;a&#8217; aynı kabul edilirken latin1_german2_ci seçerseniz farklı kabul edilir.</p>
<p>Collation altçizgiyle ( _ işareti) parçalara ayırırsak ilk kısım karakterin ait olduğu dil ailesini, ikinci kısım dili, üçüncü kısım ise karşılaştırma şeklini ifade eder. </p>
<p>Örneğin <code>latin1_swedish_ci</code> dediğimiz zaman &#8220;latin1&#8243; ailesinden &#8220;isveçce&#8221; dilini büyük-küçük harf ayrımı olmadan sırala demek istiyoruz. </p>
<p>ci: Case-Insensitive (Büyük &#8211; küçük harfe duyarsız)<br />
cs: Case-Sensitive (Büyük &#8211; küçük harfe duyarlı. Sadece bazı diller için geçerli, türkçede kullanılmaz)<br />
bin: Binary (Karakteri tanımlayan byte değerine göre karşılaştır demek. Pratikte büyük &#8211; küçük harfe duyarlılık istendiğinde kullanılır.</p>
<h2>MySQL Dil Ayarı Nasıl Yapılır?</h2>
<p>MySQL&#8217;le biraz uğraşırsanız dilin ayarlanabileceği tonla yer görürsünüz. Büyükten küçüğe doğru gidersek: </p>
<ol>
<li>Sunucu ayarı</li>
<li>Veritabanı ayarı</li>
<li>Tablo ayarı</li>
<li>Tablodaki alanın ayarı</li>
</ol>
<p>Not 1: Bu ayarlardan pratikte sizi tek ilgilendiren: tablodaki alanın karakter seti.<br />
Not 2: Buradaki ayarlar ne olursa olsun son sözü yine bağlantıyı kurduktan sonra verdiğiniz &#8220;SET NAMES utf8&#8243; komutu söyler. </p>
<h3>1. MySQL Sunucusu</h3>
<p>MySQL derlenirken tanımlanabilir:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">shell<span style="color: #000000; font-weight: bold;">&gt;</span> .<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--with-charset</span>=utf8 <span style="color: #660033;">--with-collation</span>=utf8_general_ci</pre></div></div>

<p>Ya da my.cnf / my.ini&#8217;de tanımlanabilir:</p>
<p><!--more--></p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>mysqld<span style="">&#93;</span></span>
<span style="color: #000099;">character-set-server</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">utf8</span>
<span style="color: #000099;">collation-server</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">utf8_general_ci</span></pre></div></div>

<p>Bu tanımlar sadece yeni yaratılacak veritabanları ve tabloların varsayılan karakter setinin utf8, collation&#8217;ının ise utf8_general_ci olmasını sağlar. Yani bu tanımları yapsanız bile yine de &#8220;SET NAMES utf8&#8243; demeniz gerekecektir.</p>
<h3>2. Veritabanı</h3>
<p>Veritabanı yaratılırken tanımlanır. Eğer tanımlanmazsa MySQL sunucusundaki tanım neyse o kullanılır.</p>

<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;">DATABASE</span> mydb
  <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARACTER <span style="color: #993333; font-weight: bold;">SET</span> utf8
  <span style="color: #993333; font-weight: bold;">DEFAULT</span> COLLATE utf8_general_ci;</pre></div></div>

<p>Bu yapılan tanım da sadece bu veritabanında oluşturulan tabloların varsayılan karakter seti ve collation&#8217;ının ne olacağını belirler.</p>
<h3>3. Tablo</h3>
<p>Tablo yaratılırken tanımlanır. Eğer tanımlanmazsa veritabanındaki tanım kullanılır:</p>

<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> deneme <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`x`</span> INT<span style="color: #66cc66;">&#41;</span> CHARACTER <span style="color: #993333; font-weight: bold;">SET</span> latin5 COLLATE latin5_turkish_ci</pre></div></div>

<p>Bu durumda tabloya eklenen satırların collation&#8217;ı verilmezse latin5_turkish_ci olur.</p>
<h3>4. Tablo Alanı</h3>
<p>Üstteki tabloya ispanyolca bir alan eklemek istediğimizi düşünelim:</p>

<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> deneme <span style="color: #993333; font-weight: bold;">ADD</span> <span style="color: #ff0000;">`y`</span> VARCHAR<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">10</span> <span style="color: #66cc66;">&#41;</span> CHARACTER <span style="color: #993333; font-weight: bold;">SET</span> latin1 COLLATE latin1_spanish_ci;</pre></div></div>

<p>Tablonun collation&#8217;ı türkçe olmasına rağmen alan ispanyolca oldu. Bu alana türkçe giriş yaparsanız ı,ş, ğ gibi karakterleri hatalı görürsünüz.</p>
<h2>Çalışma Şekli</h2>
<p>Bu kısımda SET NAMES &#8216;latin5&#8242; ne demek onu detaylandıracağım&#8230;</p>
<p>Veritabanının çalışma şeklini düşünürsek, biz sunucuya bir sorgu gönderiyoruz, sunucu da bu sorguyu okuyup bize bir cevap gönderiyor.</p>
<ol>
<li>Gönderdiğimiz sorgu hangi karakter setinde? Biz örneğin ascii mi gönderiyoruz yoksa utf8 mi?<br />
Bunun için sunucu <code>character_set_client</code> parametresine bakar.</li>
<li>Gönderilen sorguyu sunucu hangi karakter setine çevirmeli? Bunun için de <code>character_set_connection</code> ve <code>collation_connection</code> parametrelerine bakar. Yani sunucu gönderilen sorguyu <code>character_set_client</code> karakter setinden <code>character_set_connection</code> karakter setine çevirir.<br />
<code>collation_connection</code> parametresi sadece iki string birbiriyle kıyaslanacaksa kullanılır. Eğer bir tablo alanını bir string ile karşılaştırıyorsanız kullanılmaz çünkü bu durumda o tablo alanının collation&#8217;ı kullanılır.
</li>
<li>
Sunucu sorguyu işleyip veritabanından sonucu çektikten sonra bize gönderir demiştik, bize göndermeden önce sonucun karakter setini değiştirebilir. Bunun için <code>character_set_results</code> parametresini kullanır.
</li>
</ol>
<p>Bütün bu ayarları sunucunun konfigürasyon dosyasından yapabileceğiniz gibi (my.cnf ya da my.ini) doğrudan bir sql cümlesi ile de yapabilirsiniz. Yani php için:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;set character_set_client='latin5'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>diyebilirsiniz örneğin. </p>
<p>Sadece türkçe kullanacaksanız eğer şu komuyu verebilirsiniz:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SET character_set_client='latin5'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SET character_set_results='latin5'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SET character_set_connection='latin5'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Her seferinde bu satırları aklımızda tutmamıza gerek olmasın diye MySQL bir kısa yol koymuş, o da:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SET NAMES latin5&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>SET NAMES satırından nasıl kurtulurum?</h2>
<p>Programcıların SET NAMES satırını unutmaları ihtimaline karşı <code>init_connect</code> parametresini kullanmak pratik olabilir:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>mysqld<span style="">&#93;</span></span>
<span style="color: #000099;">init_connect</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">'SET NAMES latin5'</span></pre></div></div>

<p>Tabii veritabanını başlatırken parametre olarak da verilebilir bu.</p>
<p>Performansı arttırmak için veritabanı ayarlarına <code>skip-character-set-client-handshake</code> parametresini ekleyebilirsiniz. Bu durumda tablo alanının collation&#8217;ı kullanılacaktır ancak SET NAMES ile dili değiştirmek bu durumda mümkün olmayacaktır. Bir de, bu parametre &#8220;super user&#8221; ile bağlandığınızda geçersizdir.</p>
<h2>Türkçe Dil Desteği ile İlgili Diğer Etkenler</h2>
<p>Farklı dillerin doğru desteklenmesi için sadece MySQL&#8217;in doğru ayarlanması tabii ki yeterli değil. Dinamik web sitelerini örnek aldığımızda, Apache &#8211; PHP &#8211; MySQL platformunu düşünürsek:</p>
<ol>
<li>
<strong>Apache&#8217;nin dil ayarı</strong><br />
Header göndererek apache&#8217;de dil tanımlanabilir:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">AddDefaultCharset</span> utf-<span style="color: #ff0000;">8</span></pre></div></div>

<p>Bu tanımlanan dil hatalıysa PHP, HTML ve veritabanındaki ayarlarınız ne olursa olsun sorun yaşarsınız.
</li>
<li>
<strong>PHP</strong><br />
PHP&#8217;den de aynı apache&#8217;deki gibi header gönderilebilir:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-type: text/html; charset=utf-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Bu gönderilen header, apache tarafından gönderilenlerin sonuna eklendiği için apache&#8217;nin ayarlarını değiştiremez ancak burada dil ile ilgili header yanlış gönderilirse HTML ve veritabanındaki ayarlarınız ne olursa olsun sorun yaşarsınız.
</li>
<li>
<strong>HTML</strong><br />
HTML meta komutu ile header bilgisi simüle edilebilir.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">HTTP-EQUIV</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Content-type&quot;</span> <span style="color: #000066;">VALUE</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=utf-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></div></div>

<p>Eğer PHP ya da apache&#8217;den header gönderildiyse bu değer işe yaramaz. Eğer buradaki bilgi hatalı olursa veritabanından doğru dilde çekseniz bile sorun yaşayabilirsiniz.
</li>
</ol>
<h3>UTF-8 ile ilgili not</h3>
<p>UTF8 sonradan çıkan bir tanım. İçerisinde hemen hemen tüm dilleri barındırdığı için aslında büyük kolaylık. Ancak ilk geliştirilen ASCII formatından farklı bir altyapısı var. Dolayısıyla eğer utf8 kullanmayı seçtiyseniz yukarıdakilere ek olarak bir de dosya formatı sorunu karşınıza çıkıyor. </p>
<p>Eğer PHP ya da HTML sayfalarınızı açtığınız editör UTF8 destekli değilse ya da yeni dosya yarattığınızda dosyayı utf8 olarak kaydetmediyseniz yine sorun yaşayabilirsiniz.</p>
<p>UTF8 başlı başına bir muamma olduğu için çok detaya girmeyeceğim&#8230;</p>
<h3>Karakter sorunu çözmede izleyebileceğiniz yol</h3>
<p>Eğer karakter sorunu yaşıyorsanız aşama aşama şunu yapabilirsiniz:</p>
<p>1. Öncelikle sayfada gösterilen karakterler bozuk mu yoksa yanlış karakter setinde göstermeye çalıştığı için mi öyle gözüküyor onu tespit edin. Bunun için firefox&#8217;ta View / Character Encoding kısmından encoding doğru mu gözüküyor bakın. Eğer doğruysa ve problem utf8&#8242;leyse hata ya ilgili dosyanın utf8 olmamasıdır ya da veritabanından hatalı geliyordur. </p>
<p>2. Eğer encoding hatalıysa header&#8217;larda sorun var mı ona bakın. Header&#8217;ları görmek için firefox&#8217;un firebug extension&#8217;ından ya da ie8&#8242;in developer tools&#8217;undan vs. yararlanabilirsiniz. Eğer header farklı ise header&#8217;ın nereden geldiğini bulun: Ya apache&#8217;den ya da PHP&#8217;den gelir.</p>
<p>3. Header doğruysa &#8220;View source&#8221; diyip meta elemanına bakın. Buna &#8220;view source&#8221; ile bakın zira özellikle dinamik sitelerde kazara birden fazla meta komutunun geldiğine çok şahit oldum.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2009/05/23/mysql-turkce-destegi-collation-ve-character-set-nedir/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>HEAP tablo tipi</title>
		<link>http://www.huysuzadam.com/2007/05/29/heap-tablo-tipi/</link>
		<comments>http://www.huysuzadam.com/2007/05/29/heap-tablo-tipi/#comments</comments>
		<pubDate>Tue, 29 May 2007 08:59:11 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.huysuzadam.com/2007/05/29/heap-tablo-tipi/</guid>
		<description><![CDATA[MySQL&#8217;in çoğu zaman gözden kaçan tablo tipi HEAP&#8217;ten bahsedesim geldi bugün. HEAP tipi tabloların özelliği MySQL&#8217;in bu tipteki tabloların verilerini doğrudan RAM&#8217;de tutması. Dolayısıyla disk I/O&#8217;suna bağlı olmadığı için çok yüksek hızda cevap verebilen bir tablo tipi.
Ancak RAM&#8217;de olması nedeniyle veritabanı sunucusunun yeniden başlatılması durumunda tüm veri haliyle kayboluyor. Ayrıca çok fazla veri kaydedilmesi durumunda [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL&#8217;in çoğu zaman gözden kaçan tablo tipi HEAP&#8217;ten bahsedesim geldi bugün. HEAP tipi tabloların özelliği MySQL&#8217;in bu tipteki tabloların verilerini doğrudan RAM&#8217;de tutması. Dolayısıyla disk I/O&#8217;suna bağlı olmadığı için çok yüksek hızda cevap verebilen bir tablo tipi.</p>
<p>Ancak RAM&#8217;de olması nedeniyle veritabanı sunucusunun yeniden başlatılması durumunda tüm veri haliyle kayboluyor. Ayrıca çok fazla veri kaydedilmesi durumunda sunucunun RAM&#8217;ini doldurma ihtimali de mevcut. Peki bu iki büyük engele rağmen neden böyle bir tablo tipine ihtiyaç duyulmuş?</p>
<p><strong>Ben HEAP tabloları iki yerde kullanıyorum:</strong></p>
<ol>
<li>Session bilgisi</li>
<li>Kullanıcı cache</li>
</ol>
<p>Session bilgisi dediğim PHP&#8217;nin session altyapısı değil. Session tablosunda o an online olan kullanıcıları, bağlandıkları IP adresini ve ihtiyaç duyduğum bazı birkaç kişiye özel bilgiyi ve son aksiyon zamanını tutuyorum. Böylece hatta kaç kişi online, hangi IP adresiyle bağlı takip etme imkanım oluyor. Aslında bunun bir ileri seviyesi PHP&#8217;nin session bilgisini tamamen bir HEAP tabloda tutmak.</p>
<p>PHP&#8217;nin session bilgisini böyle bir tabloda tutmak özellikle birden fazla web sunucusu ile yayın yaptığınızda faydalı olacaktır zira session datasını dosya sisteminde tutarsanız kullanıcı round robin ya da benzeri altyapılarla farklı sunuculara yönlendirildiğinde session bilgisi kaybolacaktır.</p>
<p><strong>Cache</strong></p>
<p>İkinci kullanım alanı ise kullanıcı cache&#8217;i. FotoKritik&#8217;te kullanıcıların hesap durumlarını her bir request&#8217;te kontrol ettirmem gerekiyor. Çünkü online kişiler kural dışı bir hareket yaptıkları anda hesapları moderatörler tarafından geçici ya da kalıcı olarak askıya alınabiliyor. </p>
<p>Ayrıca kullanıcıya yeni site içi mesaj gitmiş mi gibi bilgileri de sürekli sorguluyorum. Bu sürekli sorguları hafıza yerine disk üzerinden yapmak, az hit almayan bir sitede 15.000 devirli RAID yapılmış disklerinizi bile gereksiz bir yük altına sokabilir&#8230;.</p>
<p>Bu iki tabloyu birleştirmek de mümkün olabilir, ben tercih etmedim ama önemli olan bu tarz sürekli yapılan ve sunucunun yeniden başlatılması durumunda kolayca tekrar yaratılabilecek bilgileri HEAP tipi tablolarda tutmanın gerçekten ciddi performans kazanımları sağlayacağıdır.</p>
<p>HEAP tablonun aşırı RAM tüketmesini engellemek için, tablo yaratılırken maksimum satır sayısını baştan belirleyebiliyorsunuz, ve belirlemenizi şiddetle tavsiye ederim ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2007/05/29/heap-tablo-tipi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MySQL Client için işe yarar seçenekler</title>
		<link>http://www.huysuzadam.com/2005/06/05/mysql-client/</link>
		<comments>http://www.huysuzadam.com/2005/06/05/mysql-client/#comments</comments>
		<pubDate>Sun, 05 Jun 2005 17:16:00 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.fotokritik.com/blog/?p=9</guid>
		<description><![CDATA[MySQL client&#8217;ının opsiyonlarını hiç detaylı incelememiştim, güzel şeyler var. Mesela my.cnf&#8217;ye eklediğim 2 özellik:
pager           = more
prompt          = &#8216;(\u@\h) [\d]&#62; &#8216;
Böylece birden fazla sayfalar için &#8220;more&#8221; kullanılıyor, prompt&#8217;ta da database adı ve username/host yer alıyor. Böylece neye [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL client&#8217;ının opsiyonlarını hiç detaylı incelememiştim, güzel şeyler var. Mesela my.cnf&#8217;ye eklediğim 2 özellik:</p>
<blockquote><p>pager           = more<br />
prompt          = &#8216;(\u@\h) [\d]&gt; &#8216;</p></blockquote>
<p>Böylece birden fazla sayfalar için &#8220;more&#8221; kullanılıyor, prompt&#8217;ta da database adı ve username/host yer alıyor. Böylece neye yetkim var ve en önemlisi de birden fazla versiyonla çalışırken hangi veritabanında olduğumu sürekli kontrol altında tutmam gerekmeyecek.</p>
<p>Diğer faydalı özellikler:</p>
<blockquote><p>pager cat &gt;&gt; /tmp/log.txt</p></blockquote>
<p>yapılan her işlemi (outputu) loglar.</p>
<blockquote><p>pager less -S</p></blockquote>
<p>Burdaki -S opsionu horizontal scrolling imkanı veriyor (ekrana enine sığmayan geniş queryler için).</p>
<blockquote><p>rehash    (\#)</p></blockquote>
<p>TAB completion için tabloları tekrar okur.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2005/06/05/mysql-client/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL&#8217;de Performanslı Loglama</title>
		<link>http://www.huysuzadam.com/2005/06/05/mysql-ve-log/</link>
		<comments>http://www.huysuzadam.com/2005/06/05/mysql-ve-log/#comments</comments>
		<pubDate>Sun, 05 Jun 2005 15:45:00 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.fotokritik.com/blog/?p=8</guid>
		<description><![CDATA[Sorun:
FotoKritik&#8217;te kullanıcının her bir hareketi kaydediliyor. Şu an için 7000 kullanıcının bile her hareketini loglamak oldukça &#8220;iri&#8221; bir tabloya sahip olmamıza neden oluyor. O yüzden son 1 ayın loglarını tutuyorduk sadece.  O dosya içerisinde bile sorgu yapmak ölüm zira 1 ayda 5-6 milyon satır oluyor&#8230;
Çözüm:
Öncelikle, yüksek performansı sıkıştırılabilir olması nedeniyle log tabloları için MyISAM [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Sorun:</strong></p>
<p>FotoKritik&#8217;te kullanıcının her bir hareketi kaydediliyor. Şu an için 7000 kullanıcının bile her hareketini loglamak oldukça &#8220;iri&#8221; bir tabloya sahip olmamıza neden oluyor. O yüzden son 1 ayın loglarını tutuyorduk sadece.  O dosya içerisinde bile sorgu yapmak ölüm zira 1 ayda 5-6 milyon satır oluyor&#8230;</p>
<p><strong>Çözüm:</strong></p>
<p>Öncelikle, yüksek performansı sıkıştırılabilir olması nedeniyle log tabloları için MyISAM tablo türü seçilmeli. Her hafta sunucu yükünün az olduğu bir saate koyduğum cron betiği sayesinde log tablosunu log_hafta_# adlı bir tabloya aktarıp aktif log tablosunu boşaltıyorum. Burada # hafta numarası.</p>
<p>Daha sonra bu yeni yaratılan tabloyu <a target="_blank" href="http://dev.mysql.com/doc/refman/5.0/en/myisampack.html"><em>myisampack</em></a> ile sıkıştırıyorum. myisampack komutu tabloyu sıkıştırır ve salt okunur yapar. Daha sonra bu tabloları tek bir tablo gibi sorgulamak isterseniz MySQL&#8217;in merge tablo türünden yararlanabilirsiniz.</p>
<p>myisampack, MyISAM tablosunun data kısmını sıkıştırıyor, index ve tablo yapısının bulunduğu dosyalara dokunmuyor. Sorgu yapıldığı zaman indeksten datanın bulunduğu satırı bulup &#8220;sadece&#8221; o satırı decompress ediyor. Compressed tablo daha küçük olduğu için (%60 ~ %80) disk seek&#8217;i az oluyor, sadece o satır uncompress edildiği için de bütüne bakıldığında performans kazancı sağlanıyor.</p>
<p><em><strong>Bu yöntemi kullanacaksanız testlerinizi mutlaka yedekli yapın!</strong></em></p>
<p>Burada myisampack&#8217;in kullanımı çok önemli. Veri kaybınızın olmaması için önce tablonuzu repair komutuyla onarmanızı öneririm. Daha sonra myisampack ile sıkıştırın (ben <em>myisampack -bwv</em> ile sıkıştırıyorum), <em>myisamchk -rq &#8211;sort-index &#8211;analyze</em> ile indexleri tekrar yaratın ve <em>mysqladmin flush-tables</em> ile tabloları kullanılır hale getirin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2005/06/05/mysql-ve-log/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Straight Join kullanımı</title>
		<link>http://www.huysuzadam.com/2005/06/05/v2-ele%ef%bf%bdtirilerin-performans%ef%bf%bd/</link>
		<comments>http://www.huysuzadam.com/2005/06/05/v2-ele%ef%bf%bdtirilerin-performans%ef%bf%bd/#comments</comments>
		<pubDate>Sat, 04 Jun 2005 22:33:00 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.fotokritik.com/blog/?p=7</guid>
		<description><![CDATA[Günlerdir hatta aralıklarla çalıştığım için haftalardır bir türlü çözemediğim eleştiriler sayfasındaki performans sorununu sonunda buldum.
MySQL iki tabloyu INNER JOIN yaparken anladığım kadarıyla PK&#8217;i foreign key olan tabloyu tüm satıların getirildiği ilk tablo yapıyor. Ama eleştiriler sayfasında eleştiri tablosunun ilk olması gerekiyor. JOIN cümlesindeki tabloların yerini tek başına değiştirmek bir işe yaramıyor.
SELECT STRAIGHT_JOIN dedikten sonra doğru [...]]]></description>
			<content:encoded><![CDATA[<p>Günlerdir hatta aralıklarla çalıştığım için haftalardır bir türlü çözemediğim eleştiriler sayfasındaki performans sorununu sonunda buldum.</p>
<p>MySQL iki tabloyu INNER JOIN yaparken anladığım kadarıyla PK&#8217;i foreign key olan tabloyu tüm satıların getirildiği ilk tablo yapıyor. Ama eleştiriler sayfasında eleştiri tablosunun ilk olması gerekiyor. JOIN cümlesindeki tabloların yerini tek başına değiştirmek bir işe yaramıyor.</p>
<p>SELECT STRAIGHT_JOIN dedikten sonra doğru sırada join yapıldığı zaman işe yarıyor.</p>
<p>Doğru join&#8217;de &#8220;EXPLAIN&#8221; çıktısı:</p>
<blockquote><p>************* 1. row *************<br />
table: elestiri<br />
type: index<br />
possible_keys: foto_id<br />
key: zaman<br />
key_len: 8<br />
ref: NULL<br />
rows: 234572<br />
Extra:<br />
************* 2. row *************<br />
table: foto<br />
type: eq_ref<br />
possible_keys: PRIMARY<br />
key: PRIMARY<br />
key_len: 3<br />
ref: elestiri.foto_id<br />
rows: 1<br />
Extra:<br />
2 rows in set (0.01 sec)</p></blockquote>
<p>Hatalı joinde çıktı:</p>
<blockquote><p>************* 1. row *************<br />
table: foto<br />
type: ALL<br />
possible_keys: PRIMARY<br />
key: NULL<br />
key_len: NULL<br />
ref: NULL<br />
rows: 41574<br />
Extra: Using temporary; Using filesort<br />
************* 2. row *************<br />
table: elestiri<br />
type: ref<br />
possible_keys: foto_id<br />
key: foto_id<br />
key_len: 3<br />
ref: foto.id<br />
rows: 2<br />
Extra:<br />
2 rows in set (0.00 sec)</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2005/06/05/v2-ele%ef%bf%bdtirilerin-performans%ef%bf%bd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
