首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在php和mysql大表中更改数据的分页吗?

在php和mysql大表中更改数据的分页吗?
EN

Stack Overflow用户
提问于 2016-02-18 11:14:59
回答 2查看 1.6K关注 0票数 3

我需要处理PHP和Mysql中的分页,问题陈述如下:

我有一个表,记录了两个外键的关系,比如" User“和" Item ",这个表经常为特定用户添加或删除项。现在,我想列出所有的项目给用户分页和总计数在标题中。我的桌子是MyISAM,也使用SQL_CALC_FOUND_ROWS。表结构如下,具有巨大的基数。

代码语言:javascript
复制
CREATE TABLE `USER_ITEMS` (
  `ID` int(11) NOT NULL,
  `ITEMS` int(11) unsigned NOT NULL DEFAULT '0',
  `USER` int(11) unsigned NOT NULL DEFAULT '0',
  `TYPE` char(1) NOT NULL DEFAULT '',
  `TIME` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `SEEN` char(1) NOT NULL,
  `FILTERED` char(1) NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `IND1` (`USER`,`ITEMS`),
  KEY `USER` (`USER`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

解决方案我试了一试:

  1. 对于所有分页,我在Mysql上执行一个选择,但是如果实时删除,我们可以得到重复的项,或者在pagination.Also上添加了很多次,但是由于order和其他导致性能下降的条件,查询非常慢。这是一个简单的,order和limit。
  2. 我使用Memcache存储他查看的页面中的项,并在分页期间获取不包含在Memcache中的项,但是这会导致缓慢的查询,因为well.This是,order和limit。

问题主要是数据的准确性,查询执行时间和网络阻塞的性能,php内存的耗尽。

我想知道这些是相同情况下的一般实践,还是我们有更好的方法--实现/引擎/缓存--用于此类场景。

EN

回答 2

Stack Overflow用户

发布于 2016-02-18 15:21:38

对于不丢失/复制条目的分页,您需要“记住您停止的位置”,而不是使用OFFSET

也就是说,在“下一页”中,请执行

代码语言:javascript
复制
WHERE id > $last
ORDER BY id
LIMIT 10

然后保留下一个按钮的最后一个id。(由于您没有提供代码,所以我不能说得更具体了。)

更多细节是我的页码博客的基金。

INDEX(user)是多余的,因为您有UNIQUE(user, items)

考虑摆脱id,因为唯一的键可以提升到PK。有关通过复合键的迭代,请参见另一个博客

票数 1
EN

Stack Overflow用户

发布于 2016-02-18 12:27:52

我使用这个分页来获取用户的配置文件,希望这会对您有所帮助。

代码语言:javascript
复制
<?php

     $dbhost = 'localhost';
     $dbuser = 'xyz';
     $dbpass = 'vbN';

     $rec_limit = 1;
     $conn = mysql_connect($dbhost, $dbuser, $dbpass);

     if(! $conn )
     {
        die('Could not connect: ' . mysql_error());
     }
     mysql_select_db('xyz');

     /* Get total number of records */
     $sql = "SELECT count(user_id) FROM se_users";
     $retval = mysql_query( $sql, $conn );

     if(! $retval )
     {
        die('Could not get data: ' . mysql_error());
     }
     $row = mysql_fetch_array($retval, MYSQL_NUM );
     $rec_count = $row[0];

     if( isset($_GET{'page'} ) )
     {
        $page = $_GET{'page'} + 1;
        $offset = $rec_limit * $page ;
     }
     else
     {
        $page = 0;
        $offset = 0;
     }
     $left_rec = $rec_count - ($page * $rec_limit);
     $sql = "SELECT company_name, e_mail, international_code, mob_number, nationality, current_loc, pref_location, 
     key_skills, address, user_dob, training, lang1, lang2, lang3, lang4 ".
        "FROM se_job_contracts ".
        "LIMIT $offset, $rec_limit";

     $retval = mysql_query( $sql, $conn );

     if(! $retval )
     {
        die('Could not get data: ' . mysql_error());
     }

     while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
     {
        echo "<b>Company Name</b> :{$row['company_name']}  <br> ".
           "<b>Email-ID</b> : {$row['e_mail']} <br> ".
           "<b>International code </b> : {$row['international_code']}  "."<b>Mobile No </b> : {$row['mob_number']} <br> ".
           "<b>Nationality </b> : {$row['nationality']} <br> ".
           "<b>Current Location </b> : {$row['current_loc']} <br> ".
           "<b>Preferred Location </b> : {$row['pref_location']} <br> ".
           "<b>Key Skills </b> : {$row['key_skills']} <br> ".
           "<b>Address </b> : {$row['address']} <br> ".
           "<b>User DOB </b> : {$row['user_dob']} <br> ".
           "<b>Training  </b> : {$row['training']} <br> ".
           "<b>Language known 1 </b> : {$row['lang1']} <br> ".
           "<b>Language known 2 </b> : {$row['lang2']} <br> ".
           "<b>Language known 3 </b> : {$row['lang3']} <br> ".
           "<b>Language known 4  </b> : {$row['lang4']} <br> ".
           "--------------------------------<br>";
     }

     if( $page > 0 )
     {
        $last = $page - 2;
        echo "<a href=\"$_PHP_SELF?page=$last\">Previous </a> |";
        echo "<a href=\"$_PHP_SELF?page=$page\">Next >></a>";
     }
     else if( $page == 0 )
     {
        echo "<a href=\"$_PHP_SELF?page=$page\">Next >></a>";
        }   
     else if( $left_rec < $rec_limit )
     {
        $last = $page - 2;
        echo "<a href=\"$_PHP_SELF?page=$last\">Previous </a>";
     }
    mysql_close($conn);
  ?>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35479889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档