Web ページで大量のデータ エントリを処理する最善の方法は何ですか?
song_name,author_name,song_id,posted_by; を含むテーブルに 5000 レコードのデータベースがあるとします。1 つのページにすべての曲を含むプレイリストを作成したいと考えています。また、そのページには、ページに表示されているプレイリスト エントリに従って曲を再生するプレーヤーがあります。
そのテーブルから 5000 のエントリすべてを取得して、それらを使用して JavaScript オブジェクトを作成し、そのオブジェクトを処理してプレイリストを作成し、プレイリストを検索するなどを試みました。しかし、それには非常に大量のリソース (ユーザー側で) と多くのページ読み込み時間がかかり (多くのエントリがあるため!)、ページが非常に遅くなります。
すべてのデータをオブジェクトにロードし、プレイリストの 100 レコードごとにJavaScriptでページ付けする方が良いですか、それともデータベースからページ付けされた結果を取得してプレイリストを更新する方が良いですか? (これは、プレーヤーのシャッフルボタンがアクティブになっている場合、表示されているプレイリストの現在の曲だけでなく、ユーザーのデータベース内の任意の曲にシャッフルされる可能性があるという事実を考慮したものです)
4 に答える
ページネーションが最良の選択肢だと思います。(たとえば) 100 の制限を作成し、AJAX を使用して次の 100 を抽出するだけです。クライアントがシャッフルをオンにした場合は、別の要求をサーバーに送信し、次のことを行う関数を呼び出させます。
- データベース内の合計行数を数える
- randomize 関数を使用して 100 個の乱数を取得する
- 次に、行番号に基づいてデータベースからレコードを取得するための少しトリッキーなクエリを作成します。
関数 getRandomTracks($limit) {
$total = $this->db->count_all('table_tracks');
//Get random values. Speed optimization by predetermine random rownumbers using php
$arr = array();
while (count($arr) < $limit) {
$x = mt_rand(0, $total); //get random value between limit and 0
if (!isset($arr[$x])) { //Random value must be unique
//using random value as key and check using isset is faster then in_array
$arr[$x] = true;
}
}
//Create IN string
$in = implode(',', array_keys($arr));
//Selection based on random rownumbers
$query = $this->db->query('SELECT * FROM
(SELECT @row := @row + 1 as row, t.*
FROM `table_tracks` t, (SELECT @row := 0) r) AS tracks
WHERE `row` IN(' . $in . ')');
return $query->result();
}
私は同様の機能を使用しており、大量のトラック (300.000 以上) を処理するためにも使用しているので、これでうまくいくと確信しています!
jQuery やその他のライブラリを使用している場合でも、「全体」のデータをクライアント プログラムにロードするのは非常に困難です。重要な要素は、使用しているコード/SDK ではなく、ブラウザ自体です!
ちなみにchromeが一番速く、IE(ver.10以前)が一番遅いです。
以下のリンクを参照できます。
http://www.infoq.com/news/2010/09/IE-Subsystems-Spends-Time
http://www.nczonline.net/blog/2009/01/05/what-
http://www.zdnet.com/browser-benchmarks-ie-firefox-opera-and-safari-3039420732/
http://msdn.microsoft.com/ _ en-us/library/Bb250448
http://support.microsoft.com/kb/175500/en-us
したがって、他の人が提案しているように、クライアントロジックをサーバー側に移動する必要があります。
あなたがページネーションを取得すると言ったように、すべてのデータにjavascriptだけを使用すると、本質的にページネーションがないことと同じです。
ajax を使用して、100 単位でデータをロードします (またはそれ以上、試してみてください)。
レコードセットをループして、毎回制限を増やします。
<?php
$Step = 100;
$u_limit = 0;
$sql = "SELECT song_id FROM $MySQL_DB.songs";
$data = mysql_query($sql, $dblk);
$numer_of_entries = mysql_num_rows($data);
while($o_limit < $numnumer_of_entries)
{
$o_limit = u_limit + $Step;
$sql = "SELECT * FROM $MySQL_DB.songs order by id DESC LIMIT $u_limit, $o_limit";
$data = mysql_query($sql, $dblk);
while($row = mysql_fetch_array($data))
{
// built an array and return this to ajax
}
$u_limit += $Step;
}
これを試してください:http://www.datatables.net/
不思議ですが、多分それはうまくいきます。