1.000.000 satırlık tabloda innodb parformansı.

alicilinAli Fırat Güler

selamün aleyküm arkadaşlar Benim makaleler adında bir tablom var. tablo motoru innodb. Ve içinde 1 milyonu aşkın satırlık bilgi var. tablo boyutu yaklaşık 8,5 gb şimdi bu tabloda;

id, kat_id, resim, baslik, url_baslik, icerik, okunma

isimlerinde stunlarım var. id stunu auto icrement. kat_id ve url_baslik stunlarında da index var.

bir makaleyi görüntülemek istediğimde url_baslik stununu kullandığımda yani örneğin;

index.php?makale-url=ali-veli-deli şeklinde çok hızlı bi şekilde sonucu veriyor.

fakat iş sayfalamaya geldiğinde innodb can çekişiyor.

yani şöyle diyeyim mesela ben bu makaleleri 10 ar 10 ar sayfaladığımda yaklaşık 109.409 sayfa oluşuyor. ilk sayfalar çok hızlı yani ilk 1000 sayfa bayağı bi hızlı. ama  ilk 1000 sayfadan ileriye doğru gidildikçe aşırı yavaş.

sql sorgularımı gözden geçirdim ama yapılabilicek en hızlı ve en sade sql sorguları.

yanlız bu yavaşlığın nedeninin mysqlin limit  olayını kullandığımızda örneğin

LIMIT 35484,10; gibi bir kullanımda limit arasında kalan verileri baştan sayarak bulup öyle verdiğini düşünüyorum. bu yüzden sayfa yükseldikçe yavaşlıyor.

sizlere sorum üstadlar. bu olayı nasıl hızlandırabilirim ?

2012-03-03 16:16:10

Php

şunu dene:

WHERE id > 35484 LIMIT 0,10

Her programcı birgün Php yi tadacaktır
2012-03-06 21:32:14

Php

yusuefYusuf PolatAvatar

Sayfa yükseldikçe yavaşlıyor düşüncesi yanlış. Bir yavaşlama olacağı kesin ama öyle saniyeler cinsinde değil, saniyenin 10000 de biri kadar küçük bir zaman dilimi.

Drekon'un dediği gibi sana lazım olan aralığa limit eklersen yavaşlama olmaz.

2012-03-07 10:17:52

alicilinAli Fırat Güler

Sayfa yavaşlıyor düşüncesi yanlış değil üstad. Denemesini ben yaptım. 1000 küsür sayfalardan sonra iyice yavaşlamaya başlıyor hatta son sayfalarda resmen kitleniyor çalışmıyor. bununda sebebi benim mysqlden veri isterken Limit 156896,10 şeklinde istemem. mysql  data dosyasında 156896. sırada olan veriyi bulması için tek tek satır saymak zorunda ki  o sırada olan satırı bulup o satırdan sonra 10 tane satır versin.

 Fakat drekon hocamın verdiği  şekilde where kullanarak mysqlin sayacağı alanı daraltmış oluyorum. böylece mükemmel bi hız oluyor. Teşekkrüer cevaplar için saolun üstadlar.

2012-03-07 14:48:22

Edit:

Php

yusuefYusuf PolatAvatar

Peki diyelim ki senin dediğin doğru. Facebook gibi bir site o zaman saniyeden bile hızlı nasıl açılıyor?

Senin o kodları denediğin makinede yada hostunun bulunduğu sunucu yavaşlıyordur.

Veritabanı yönetiminde index diye bir kavram vardır ve index sayesinde 158896. sıradaki kaydı bulması çok küçük bir zaman dilimi ama makinenin sana dönderdiği sonuç geç ise bu denemeyi yaptığın makinenin yavaşlığındandır.

2012-03-15 09:28:08

php

alicilinAli Fırat Güler

1. olarak facebook bu hızlılığını memory cache serverlerine bağlı. 2. olarak facebook normal mysql kullanmıyor. kendi mühendisleri var hocam adamların.

3. olarak siz mysql de limit kullanırken mysql'e veri saydırıyorsunuz. işte bu veri sayma olayının indexle alakası yoktur hocam.

yani  mysql'e LIMIT 1289653,20 dediğimizz zaman mysql'e id numarası 1289653 olan makaleden sonra 20 tane ver demiyoruz. Mysql'e 1289653'üncü satırdaki veriden sonra 20 tane veri ver diyoruz. peki mysql napıyor ? en baştan saymaya başlıyor ve o sıradaki satırı bulup  ondan sonra 20 tane satır veriyor. işte bu yüzden yavaş. tabi where id> 1256.... gibi bir daraltma kullanmazsak böyle.

Çözüm: Drekon hocamında dediği gibi. performanslı sayfalama yapılmasını istiyorsak veritabanında autoicrement bir id stunumuz olmalı ve veri sıralarken en son sıralanan verinin id numarasını alıp mysqlin sayma alanını küçültmemiz gerekli. yani sadece limit değilde WHERE id>1289653,20 LIMIT 0,20 dediğimizde mysql zaten id stunu için index tuttuğundan dolayı o id numaralı veriyi çok hızlı şekilde bulucak ve ondan sonra 20 tane veriyi anında sayıp vericektir bize. anlatmak istediğim buydu hocam. iyi geceler.

2012-03-28 02:03:52 Edit:2012-03-28 02:06:32

Edit:

Php

milyonlardan sonra mysql sıkıntı çıkarıyor. Bu konuda suçlu da sayılmaz çünkü normal PC üzerinde 1 Gb boyundaki bir text dosyasında arama yaparken bile bilgisayar kilitlenir.

Bunu çözmek için birkaç yol varmış ama herşeyden önce kullanılan sorgu cümlesi ve index seçimleri geliyor. myisam yerine Innodb kullanmak da farkedebilir.

Her programcı birgün Php yi tadacaktır
2012-03-28 16:56:17 Edit:2012-03-28 17:01:03

Php

internette birkaç ipucu buldum. kullandığın RAM miktarı ve mysql configurasyton ayarları da önemli demişler.

InnoDB kullanıyorsan innodb_buffer_pool_size değerini RAM miktarının 70% değeri kadar yap.

MyISAM kullanıyorsan set key_buffer_sizedeğerini RAM miktarının 1/3 ü kadar yap (.MYI index dosyası boyutuna göre değişir).

Her programcı birgün Php yi tadacaktır
2012-03-28 16:59:27

phpkodlari.com © 2009 Herkes Php öğrenecek
Eglence ve Oyun: Gamikro