Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php和mysql大型表中更改数据的分页?_Php_Mysql_Performance_Pagination - Fatal编程技术网

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

在php和mysql大型表中更改数据的分页?,php,mysql,performance,pagination,Php,Mysql,Performance,Pagination,我需要在PHP和Mysql中处理分页,问题陈述如下: 我有一个表,其中包含数十万条关于两个外键关系的记录,即“User”和“Item”,该表经常更改,为特定用户添加或删除Item。现在,我想向用户列出标题中带有分页和总计数的所有项目。我的表是MyISAM,并使用SQL\u CALC\u FOUND\u行。表结构如下所示,具有巨大的基数 CREATE TABLE `USER_ITEMS` ( `ID` int(11) NOT NULL, `ITEMS` int(11) unsigned N

我需要在PHP和Mysql中处理分页,问题陈述如下:
我有一个表,其中包含数十万条关于两个外键关系的记录,即“User”和“Item”,该表经常更改,为特定用户添加或删除Item。现在,我想向用户列出标题中带有分页和总计数的所有项目。我的表是MyISAM,并使用SQL\u CALC\u FOUND\u行。表结构如下所示,具有巨大的基数

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;
解决方案我尝试了一下:

  • 我使用limit for all pagination在Mysql上执行了一次选择,但如果实时删除了重复项,或者在分页时添加了遗漏项。很多时候,由于order by和其他导致性能下降的条件,查询速度非常慢。这是带有where、orderby和limit的简单Select查询
  • 我使用Memcache存储他查看的页面的项目,并在分页过程中获取除Memcache中的项目之外的项目,但这也会导致查询速度变慢。这是使用where with Items NOT in、order by和limit的Select query
  • 问题主要是数据的准确性,查询执行时间和网络阻塞方面的性能,php内存耗尽

    我想知道这些是否是相同情况下的常规做法,或者对于此类场景,我们是否有更好的实现/引擎/缓存

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


    要在不丢失/重复条目的情况下分页,您需要“记住您离开的位置”,而不是使用
    偏移量

    也就是说,对于“下一页”,请执行以下操作

    然后保留[下一步]按钮的最后一个id。(由于您尚未提供代码,我无法更具体地说明。)

    更多细节见基金

    索引(用户)
    是多余的,因为您有
    唯一的(用户,项目)


    考虑去掉
    id
    ,因为唯一密钥可以提升为PK。要通过复合键进行迭代,请参见。

    能否显示一些代码或屏幕快照?我在MySQL中有一个8TB的数据数据库,我们将这样的表拆分为一个新的数据库,每个客户端有一个表,如“item.user_1”,即“database.table_[user_id]”。也许一开始觉得这可能不合逻辑,但我们有一些客户机的表容量为500GB,而另一些客户机的表容量为3GB。这有助于加快简单查询的速度。这与我在第1点解决方案中提到的相同,这里我面临两个问题
    <?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);
      ?>
    
    WHERE id > $last
    ORDER BY id
    LIMIT 10