十万条记录MySQL数据库导入后部分页面404问题求助
解决MySQL大数据量下的分页查询404问题
首先梳理下你的问题场景:数据库是第三方创建的单表结构,存页面URL和对应数据,5000条数据时运行正常,但导入10万条后,首页、第2/3页能正常打开,第55321页却报404。服务器配置(SSD VPS+Nginx+PHP-FPM,资源充足)没问题,那咱们逐个解答你的疑问,再排查核心问题。
你的疑问与解答
1. 是否是数据库导入后正在自动创建索引,需要等待完成?
完全不需要等待。你的表已经把page设为PRIMARY KEY,InnoDB的主键是聚簇索引,数据导入过程中会实时维护这个索引,导入完成后索引就已经完全可用了。所以404问题和索引后台创建无关。
2. 是否需要手动创建索引?求对应的SQL命令。
不需要额外创建索引!你的查询都是基于page字段的精确匹配(WHERE page='$fn'),而page已经是主键——主键本身就是唯一索引,且InnoDB的聚簇索引对于这种精确查询的效率已经拉满了。
不过这里必须提醒你:你的代码存在严重的SQL注入风险!直接把用户输入的$fn拼接到SQL语句里,没有任何过滤或转义,这不仅可能导致查询异常,还会让数据库暴露在攻击风险中。建议立即改用预处理语句,比如用mysqli的写法:
// 替换原有的mysql_query查询逻辑 $stmt = mysqli_prepare($msconnect, "SELECT * FROM `domain_com` WHERE page=?"); mysqli_stmt_bind_param($stmt, "s", $fn); mysqli_stmt_execute($stmt); $res = mysqli_stmt_get_result($stmt);
3. 是否需要切换为MYISAM引擎来优化索引?
绝对不需要!MyISAM是老旧的存储引擎,不支持事务、行级锁,并发场景下性能远不如InnoDB。而且InnoDB的聚簇索引完全适配你的查询场景,切换到MyISAM不仅解决不了404问题,还会带来数据一致性、并发性能等潜在风险。
核心问题排查方向
前面的页面正常,唯独第55321页报404,建议从这几点入手:
- 验证数据库中是否存在该页面的记录:直接执行SQL查询
SELECT * FROM domain_com WHERE page='ctg-xxx-55321.txt'(替换成实际生成的文件名),如果没有结果,说明这条数据可能在导入时丢失,或者文件名格式和数据库存储的不一致。 - 检查文件名生成逻辑:比如
ctg.php中$fn = "ctg-$c-$p.txt",确认当$p=55321时生成的文件名,和数据库中存储的page值是否完全一致(注意大小写、特殊字符、编码差异)。 - 检查PHP变量处理:确认
$p是否被正确转换为数字,有没有因为数值过大被截断或转为字符串的情况,导致生成的文件名和数据库中的不匹配。 - 清理缓存文件:如果之前尝试访问过该页面但没生成缓存文件,后来数据库补上了数据,可能需要手动删除对应的缓存文件(如果存在)后重新访问。
附相关代码
product.php
<? $n = $_GET["n"]; if (isset($_GET["ctgfolder"])) { $ctgfolder = $_GET["ctgfolder"]; } else { $ctgfolder = ''; } if (strlen($ctgfolder) > 0) { $fn = "$ctgfolder/product-$n.txt"; } else { $fn = "product-$n.txt"; } if (file_exists($fn) == true) { $file = fopen($fn, 'r'); $tx = fread($file, filesize($fn)); fclose($file); } else { if (file_exists("dbinfo.php") == true) { include "dbinfo.php"; $site_encoding = 'utf8'; $msconnect = mysql_connect($mshost, $msuser, $mspassword); mysql_select_db($msname, $msconnect); mysql_query("SET NAMES 'utf8'"); if ($site_encoding != 'utf8') { mysql_query("SET character_set_client = $site_encoding"); mysql_query("SET character_set_connection = $site_encoding"); mysql_query("SET character_set_results = $site_encoding"); } $res = mysql_query("SELECT * FROM `domain_com` WHERE page='$fn'"); if ($res) { if ($row = mysql_fetch_array($res)) { $tx = $row['data']; $file = fopen($fn, 'w'); fwrite($file, $tx); fclose($file); } } mysql_close($msconnect); } } $k = 0; $p = strpos($tx, '{#'); while ($p !== false) { $p2 = strpos($tx, '#}', $p); $im = substr($tx, $p + 2, $p2 - ($p + 2)); $k++; //-------------- if (file_exists("dmcr.php")) { include "dmcr.php"; } else { include "../dmcr.php"; } //------------- $mcr[$k] = $im; $p = strpos($tx, '{#', $p2 + 2); } if (file_exists("template_page.php")) { include "template_page.php"; } else { include "../template_page.php"; } ?>
index.php
$fn="index_page.txt"; if(file_exists($fn)==true){ $file=fopen($fn,'r'); $tx=fread($file,filesize($fn)); fclose($file); } else { if(file_exists("dbinfo.php")==true){ include "dbinfo.php"; $site_encoding='utf8'; $msconnect = mysql_connect($mshost, $msuser, $mspassword); mysql_select_db($msname, $msconnect); mysql_query("SET NAMES 'utf8'"); if($site_encoding!='utf8'){ mysql_query("SET character_set_client = $site_encoding"); mysql_query("SET character_set_connection = $site_encoding"); mysql_query("SET character_set_results = $site_encoding"); } $res=mysql_query("SELECT * FROM `domain_com` WHERE page='$fn'"); if($res){ if($row=mysql_fetch_array($res)){ $tx=$row['data']; $file=fopen($fn,'w'); fwrite($file,$tx); fclose($file); } } mysql_close($msconnect); } } $k=0; $p=strpos($tx,'{#'); while($p!==false){ $p2=strpos($tx,'#}',$p); $im=substr($tx,$p+2,$p2-($p+2)); $k++; //-------------- include "dmcr.php"; //------------- $mcr[$k]=$im; $p=strpos($tx,'{#',$p2+2); } include "template_page.php"; ?>
ctg.php
<? $c = $_GET["c"]; $p = $_GET["p"]; if (strlen($c) == 0) { $c = 1; } if (strlen($p) == 0 or is_numeric($p) == false) { $p = 1; } $fn = "ctg-$c-$p.txt"; if (file_exists($fn) == true) { $file = fopen($fn, 'r'); $tx = fread($file, filesize($fn)); fclose($file); } else { if (file_exists("dbinfo.php") == true) { include "dbinfo.php"; $site_encoding = 'utf8'; $msconnect = mysql_connect($mshost, $msuser, $mspassword); mysql_select_db($msname, $msconnect); mysql_query("SET NAMES 'utf8'"); if ($site_encoding != 'utf8') { mysql_query("SET character_set_client = $site_encoding"); mysql_query("SET character_set_connection = $site_encoding"); mysql_query("SET character_set_results = $site_encoding"); } $res = mysql_query("SELECT * FROM `domain_com` WHERE page='$fn'"); if ($res) { if ($row = mysql_fetch_array($res)) { $tx = $row['data']; $file = fopen($fn, 'w'); fwrite($file, $tx); fclose($file); } } mysql_close($msconnect); } } $k = 0; $p = strpos($tx, '{#'); while ($p !== false) { $p2 = strpos($tx, '#}', $p); $im = substr($tx, $p + 2, $p2 - ($p + 2)); $k++; //-------------- if (file_exists("dmcr.php")) { include "dmcr.php"; } else { include "../dmcr.php"; } //------------- $mcr[$k] = $im; $p = strpos($tx, '{#', $p2 + 2); } include "template_page.php"; ?>
模板页说明
页面包含template.php文件的内容
内容的提问来源于stack exchange,提问作者Anton K
相关产品推荐
相关产品推荐

