2012-03-26 16 views
0

去年、ウェブサイトファイルのページ設定を作成しましたが、これを実際に使用する必要はありませんでした。PHPのページネーション機能をより高速に実行するためにアップグレードする

しかし、今ではより大きなアプリケーションで使用する必要があります。また、膨大な量のmysql行で本当にうまく動作しないことは恐れています。わかりません。

私はコードをアップグレードする必要があるかどうかを誰かが教えてもらえれば嬉しいです。

/* Connection file */ 
include('config.php'); 

/* Get the amount of all rows */ 
$mqc = "SELECT COUNT(*) AS total FROM table"; 
$mqe = mysql_query($mqc); 
$mqn = mysql_fetch_array($mqe); 
$total = $mqn['total']; 


/* Rows per page */ 
$perPage = 10; 

/* Range for the pagination */ 
$range = 5; 

/* Actual page */ 
$page = isset($_GET['page']) && 
      is_numeric($_GET['page']) && 
      !empty($_GET['page']) ? 
      ((int)$_GET['page'] * $range) : 0; 

/* Query */ 
$mqc = "SELECT * FROM table 
      LIMIT " . $page . ", " . $perPage . " "; 
$mqe = mysql_query($mqc); 

/* Show results */ 
while($l = mysql_fetch_object($mqe)) 
{ 
    echo $l->id . ' - ' . $l->title . '<br />'; 
} 

/* Function for pagination */ 
function pages($total = false, $perPage = false, $page = false, $range = false) 
{ 
    /* Number of pages */ 
    $totalPages = (ceil($total/$perPage)) - 1; 
    /* The range * 2 */ 
    $range = $range; 
    /* The real param $_GET['page'] */ 
    $realGetPage = !empty($page) ? ($page/$range) : 0; 

    /* Show the first page */ 
    if($realGetPage >= 7) 
    { 
     echo ' <a href="?page=0"> 1 </a> ... '; 
    } 

    /* Loop to create the range */ 
    for($i = ($realGetPage - $range); $i < ($range + $realGetPage); $i++) 
    { 
     /* Check out if the value isn't outta range */ 
     if($i > 0 && $i < $totalPages) 
     { 
      /* Highlight the actual page */ 
      if(($i - 1) == $realGetPage) 
      { 
       echo ' [ <a href="?page=' . ($i - 1) . '"> ' . $i . ' </a> ] '; 
      } 
      else 
      { 
       echo ' <a href="?page=' . ($i - 1) . '"> ' . $i . ' </a> '; 
      } 
     } 

     /* Store the number of the last page */ 
     $lastPage = ($i + 1); 
    } 

    /* Hack to show 5678910 */ 
    if($lastPage < ($range * 2) + 1) 
    { 
     for($j = $lastPage; $j <= ($range * 2); $j++) 
     { 
      if(($j - 1) == $realGetPage) 
      { 
       echo ' [ <a href="?page=' . ($j - 1) . '"> ' . $j . ' </a> ] '; 
      } 
      else 
      { 
       echo ' <a href="?page=' . ($j - 1) . '"> ' . $j . ' </a> '; 
      } 
     } 

    } 

    /* Last page */ 
    echo ' ... <a href="?page=' . $totalPages . '"> ' . $totalPages . ' </a> '; 
} 

/* Show the pagination */ 
pages($total, $perPage, $page, $range); 

あなたはどう思いますか?

+1

を結合の数を減らすために非正規化を使用することを検討してください。具体的な心配はありますか? – Tchoupi

+0

私は巨大なアプリケーションで作業したことはありません...私はそれが100万以上の行になると思っています。そして、他の多くのテーブルでは巨大なので... INNERと物を使って一緒に選択します – Foreba

答えて

1

私が見落としている主なものはORDER BYです。これがなければ、ページングされた結果は(潜在的に)予測できません。

ORDER BY句を追加し、ソート可能な列に適切なデータベースインデックスを配置してください。

また、プリペイドドステートメントとバインドされたパラメータを使用して、より最新のデータベース接続ライブラリに切り替えることをお勧めします。 をご覧ください。

+0

私は今それを変更しています... – Foreba

2

あなたのコメントに記載されている情報から、パフォーマンス上の問題はPHPスクリプトのものではありません。巨大なテーブルで複数のINNER JOINSを実行すると、これがまさにあなたのパフォーマンスに影響します。探すためにいくつかの重要な事柄:

  • テーブルインデックス(あなたはフィルタを使用している場合、あなたは主キーに参加しない場合、あなたが参加するために)
  • を結合の数を減らすために、あなたのテーブル/クエリの最適化
  • 多くのトラフィックが必要な場合は、クエリにキャッシュを使用することを検討してください(memcachedなど)
  • ORDER BYを使用して予測可能な結果を​​表示する必要があり、テーブルを使用するとクエリが遅くなる可能性があります。あなたは
  • cronジョブを使用してプリレンダリング注文テーブルでしこれは私が見た中で最も改ページのように見えます
+0

大丈夫、ありがとう...私はスクリプトを作成しているときに覚えています... – Foreba

関連する問題