假设我有一个包含100,000个条目的庞大数据库my_table (id,name)
我想打电话给所有的礼物
$conn = mysql_connect('localhost','USER','PASS') or die(mysql_error());
mysql_select_db('my_table',$conn);
$sql = "SELECT * from my_table";
$result = mysql_query($sql,$conn);
while ($row = mysql_fetch_array($result)){
$name = $row['name'];
$id = $row['id'];
echo $name;
echo "<br>(done)<br>";
}
问题
让我几乎要哭的问题,加载需要很长时间,然后它会同时显示名称(记住my_table的100,000个条目),有时它会突然显示一次或甚至某些时候挂断的数量。/ p>
我的问题
有什么方法可以调用它,以便它显示结果一个名称,一个名称,如流名称1(完成),名称2(完成),名称3(完成),名称4(完成),名称5(完成), ......等没有立刻显示出来
我担心它可能需要一些ajax的想法,或者我真的不知道但这对我很重要,所以你的帮助对我来说非常有用。
答案 0 :(得分:3)
您需要使用AJAX
。
MySQL
支持通过调用attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE)
启用的服务器端游标。但是,为此,您需要在应用程序服务器上运行PHP
,这将保持AJAX
调用之间的连接。如果您可以这样做,那么使您的查询成为预准备语句,在AJAX调用中传递会话令牌以识别查询语句,并在每次收到1000
请求时获取AJAX
(或其他)行
如果您不能这样做,那么您可以提供页码并将其传递给LIMIT
子句:
SELECT *
FROM mytable
ORDER BY
id
LIMIT $pageSize
OFFSET $pageNum * $pageSize
但是,在调用之间更改了表,这可能会破坏顺序。
答案 1 :(得分:2)
每秒进行一次Ajax调用以拉回一行。制作一个计数器,并在ajax运行一次后添加到计数器。在运行ajax之前测试计数器以查看它是否为100,000,如果没有运行ajax并将计数器发送到php文件,告诉它在sql语句中WHERE id= $counter
答案 2 :(得分:1)
您可以将AJAX与LIMIT一起用于加载有限的行。
答案 3 :(得分:1)
答案 4 :(得分:0)
不要一次获取完整数据,而是定义返回结果的限制,例如100或者你喜欢什么,并提供分页以便下次接下来,同时获取数据保留下一个可能的缓存数据
请查看以下链接以获取更多许可。
http://www.tuxradar.com/practicalphp/9/4/9
Processing a large amount of data efficiently with MySQL and PHP
Selecting large amount of rows from database table with MySQL