升级PHP分页功能以更快地运行

时间:2012-03-26 02:56:57

标签: php mysql performance pagination

我去年创建了一个网站文件的分页,我从来没有真正再次使用它。

但是现在我需要在一个更大的应用程序中使用它,我担心它对于大量的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 );

您怎么看?

2 个答案:

答案 0 :(得分:2)

根据您在评论中提供的信息,您可能遇到的性能问题不会来自您的PHP脚本。如果您在巨大的表上执行多个INNER JOINS,这正是会影响您的性能的。需要注意的一些重要事项:

  • 表索引(如果使用过滤器,如果未加入主键,则为联接使用)
  • 优化您的表/查询以减少JOIN数量
  • 如果您预计会有大量流量,请考虑为查询使用缓存(例如,memcached)
  • 正如Phil所提到的,ORDER BY必须用于呈现可预测的结果,如果使用表格,可能会减慢查询速度。您可以使用cron作业预先呈现有序表格
  • 考虑使用非规范化来减少JOINS数量

答案 1 :(得分:1)

我看到的主要内容是ORDER BY条款。如果没有这个,您的分页结果(可能)是不可预测的。

添加ORDER BY子句,并确保在可排序列上有适当的数据库索引。

我还建议使用预准备语句和绑定参数切换到更新的数据库连接库。请参阅PDO