Mysql_data_seek Performans sonuçları

4 Cevap php

Ben işaretçi değişen ve geçerli 'sayfasını' okuyarak benim veritabanı sınıfa şeffaf sayfalandırma rulo için kolay bir yol olarak mysql_data_seek () kullanmaya başladım.

Bunu yapmanın performans etkileri nelerdir? Ben sadece PHP kendisi içine ihtiyacım verileri okuyorum, ama çoğu durumda SELECT tüm tablo kapakları - Bu kötü ve ben büyük tabloları ile ilgili sorunları vuracaktır?

4 Cevap

If I understand your idea you select all records in the table, then skip the first n*page records with mysql_data_seek() in order to "get to" the current page and read n records. If you have a lot of records you might not want to do that because http://php.net/mysql_data_seek says:

Note: The function mysql_data_seek() can be used in conjunction only with mysql_query(), not with mysql_unbuffered_query()
The difference between mysql_query() and the unbuffered version is that mysql_query() returns only after the whole result set has been copied from the MySQL server to the PHP process' memory while after the unbuffered version each mysql_fetch_xyz() has to receive the next record from the server. If you have a lot of records and you have to transfer all of them for each single request that sounds a bit suboptimal.
I guess you want to do this to get the total amount of records and the current subset with only one query. With MySQL you can have both, a LIMIT clause and the total number of records (that would be in the result set without the LIMIT clause),
SELECT SQL_CALC_FOUND_ROWS id FROM foo
ORDER BY id LIMIT 20,10

bkz http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

Ben senin SELECT açıklamada uygun LIMIT tümcesini kullanarak (bu kesinlikle en az araması zaman kazandıracak) daha verimli olduğunu hayal, ama nasıl {[içinde nasıl internals bilmiyorum (2)]}, işleri özellikle okur ise x kayıtları ve onları atar, ya da dosya sistemi gibi çalışıp çalışmadığını seek komutları yapmak (gönderme atlamak için bunu söylüyorum MySQL için bir sinyal gönderir sonraki x kayıtları).

Ilk şekilde çalışır, ben minimal bir hızlanma bu şekilde yaparak beklersiniz. Bu daha sonra yolu olsaydı, ben bir hıza bekliyoruz, ama kadar sadece uygun LIMIT tümcesini kullanarak istemem.

Endişelenecek tek şey masa boyutudur.

Temelde, Tradeoff arasında:

  • Bütün tablo Okuma / veritabanına yuvarlak gezileri tasarrufu sağlayarak tek resultset, içine neden
  • veya DB, sayfa başına bir çoklu lokma büyüklüğünde ziyaretler yaparak

Uygulama demekse kullanıcılar genellikle o zaman gereksiz yere büyük veri wodges saklıyorsanız, ilk sayfa veya iki geçmiş alamadım. OTOH kullanıcıların tüm sayfalarını ziyaret etmek eğilimindedir, ve pek çok (ve dinamik sayfalamayı ya da yarı-kalıcı sunucu tarafı bellek kabını kullanarak konum, yani her sayfa ziyareti, yeni bir sayfa isteği / resultset başlatmak değil) ise, sonra bir yerde resultset tutarak birden fazla kullanıcı arasında önbelleğe alınan özellikle, gayet iyi.

Eğer mimari içine inşa ettik sürece Ancak, sizin gibi bir şey kullanarak kapalı muhtemelen daha iyi

...LIMIT 10,10

...LIMIT 20,10

vb sorgu olsa, ve çoklu DB acı ihtiyacınız olacak daha fazla veri okumak zorunda, ve gereksiz yere saklayarak önlemek için vurur.

Sorgu yürütme maliyeti yüksek ise, I) (mysql_seek_data ile devam edeceğiz.

Normally pagination needs two query executions ref: [ MySQL pagination without double-querying? ]

a) döndürülen kayıtların toplam hayır bulmak için sorgu yürütmek

b) execute the query with limit clause to fetch only desired results
For second case please check the question :

Sorgu yürütme maliyeti çok yüksek ise, ben başarıyla kullanmış gibi, ikinci yürütülmesi için gitmek ve mysql_seek_data () fonksiyonu için tercih edeceğiz