- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
带有指导如何使用 LIMIT 的答案的问题并不适合我的情况,但可能是我误解了 LIMIT 的局限性和缺陷。或者,也许我的查询是错误的,这使得这个问题合法。
我有一个名为“child_pages”的表,其中包含一个名为“url”的字段,其值是应该抓取的网址。抓取属于该 url 的页面后,生成的内容 html 将存储在名为“content”的字段中。 child_pages 表有 200,000 条记录。
该表还有一个“已扫描”和“已处理”字段,它们都是tinyint,所以我可以说“1”=是,该行已被扫描,而“1”=该行已被处理。
我将一个脚本设置为本地服务(Windows),该脚本将读取 child_pages 表并从 url 字段读取值,然后执行抓取,最后将生成的 html 存储到内容字段中。完成此操作后,“已扫描”字段将标记为“1”。
现在另一个脚本也单独运行,该脚本查询 child_pages 表,查找所有已扫描='1'但已处理='0'的记录。从该结果集中,我将从未处理的记录中读取内容字段的 html 值,最后对我从“内容”字段 html 中提取的数据进行一些处理。
这是我的查询:
$sql = "SELECT id,content FROM child_pages WHERE scanned='1' AND processed='0' LIMIT 1000";
我注意到处理速度非常慢。我每五秒处理 1 到几条记录。我想,当我一次选择 1000 行时,怎么可能呢?
所以我在 while 循环内输出了一个循环计数器,我发现它没有返回 $counted = 1000,而是返回 $counted = 60 之类的东西。
我查询了child_pages表,发现95%的记录都被processed='0',所以有足够的记录来容纳LIMIT 1000。
有没有办法强制我的查询返回 1000 行?
完整查询循环:
$start = "<div id=\"detailtable\">";
$stop = "</table></td></tr></table></div>";
$sql = "SELECT id,content FROM child_pages WHERE scanned='1' AND processed='0' LIMIT 1000";
$stmt = $db->query($sql);
$new = 0;
$lookedat = 0;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
$lookedat++;
$content = $row['content'];
$cid = $row['id'];
$mark1 = strpos($content,$start);
$mark2 = strpos($content,$stop);
//echo $mark1 . ", " . $mark2;
$segment = substr( $content,$mark1, ($mark2 - $mark1) + strlen($stop) );
$doc = new simple_html_dom($segment);
if ( ! is_null($doc->find("div[id=detailtable]", 0)) ){
$detailtable = $doc->find("div[id=detailtable]", 0);
if(count($detailtable) == 1){
$e = $detailtable->children();
$children = $e[0]->find('.data');
$count = 0;
$insert['processed_thru'] = trim($children[0]->plaintext);
$insert['document_number_j'] = trim($children[1]->plaintext);
$insert['status'] = trim($children[2]->plaintext);
$insert['case_number'] = trim($children[3]->plaintext);
$insert['name_of_court'] = trim($children[4]->plaintext);
$insert['file_date'] = trim($children[5]->plaintext);
$insert['date_of_entry'] = trim($children[6]->plaintext);
$insert['expiration_date'] = trim($children[7]->plaintext);
$insert['amount_due'] = trim(str_replace("$","",$children[8]->plaintext));
$insert['interest_rate'] = trim($children[9]->plaintext);
$insert['plaintiff'] = trim($children[10]->plaintext);
$insert['defendant'] = "";
for($iii=11;$iii<count($children) ;$iii++){
$insert['defendant'] .= trim($children[$iii]->plaintext);
}
if( $insert['status'] !== "TERMINATED" &&
strpos($insert['plaintiff'],"STATE OF FLORIDA") == false &&
strpos($insert['plaintiff'],"DEPARTMENT OF REVENUE") == false &&
strpos($insert['plaintiff'],"DEPARTMENT OF ENVIRONMENTAL PROTECTION") == false){
//net elements here
/*echo "<pre>";
print_r($insert);*/
// table: cases2 columns: id,processed_thru,document_number_j,status,case_number,name_of_court,file_date,date_of_entry,expiration_date,amount_due,interest_rate,plaintiff,defendant
$colstring = "processed_thru,document_number_j,status,case_number,name_of_court,file_date,date_of_entry,expiration_date,amount_due,interest_rate,plaintiff,defendant";
$prepareColString = ":processed_thru,:document_number_j,:status,:case_number,:name_of_court,:file_date,:date_of_entry,:expiration_date,:amount_due,:interest_rate,:plaintiff,:defendant";
$table = "cases";
foreach($insert as $k=>$v){
${"$k"} = trim(preg_replace( '/\h+/', ' ', $v ));
}
$stmt2 = $db->prepare("INSERT INTO $table ($colstring) VALUES ($prepareColString)");
$stmt2->bindParam(':document_number_j', $document_number_j);
$stmt2->bindParam(':processed_thru', $processed_thru);
$stmt2->bindParam(':status', $status);
$stmt2->bindParam(':case_number', $case_number);
$stmt2->bindParam(':name_of_court', $name_of_court);
$stmt2->bindParam(':file_date', $file_date);
$stmt2->bindParam(':date_of_entry', $date_of_entry);
$stmt2->bindParam(':expiration_date', $expiration_date);
$stmt2->bindParam(':amount_due', $amount_due);
$stmt2->bindParam(':interest_rate', $interest_rate);
$stmt2->bindParam(':plaintiff', $plaintiff);
$stmt2->bindParam(':defendant', $defendant);
$stmt2->execute();
$new++;
}
}
}
$processed = 1;
$stmt3 = $db->prepare("UPDATE child_pages SET processed=:processed WHERE id=:id");
$stmt3->bindParam(':id', $cid);
$stmt3->bindParam(':processed', $processed);
$stmt3->execute();
}
配件数据:
RECORDS SCANNED : 60
NEW CASE RECORDS : 8
COMPUTATIONS IN ms : 422
SYSTEM CALLS IN ms : 15
Total execution time in seconds: 129.66131019592
输出附件数据的代码:(这些位于脚本顶部)
// At start of script
$time_start = microtime(true);
$rustart = getrusage();
function rutime($ru, $rus, $index) {
return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000))
- ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000));
}
echo "<p>RECORDS SCANNED : $lookedat </p>";
echo "<p>NEW CASE RECORDS : $new </p>";
$ru = getrusage();
echo "<p>COMPUTATIONS IN ms : " . rutime($ru, $rustart, "utime") . "</p>";
echo "SYSTEM CALLS IN ms : " . rutime($ru, $rustart, "stime") . "</p>";
// Anywhere else in the script
echo '<p>Total execution time in seconds: ' . (microtime(true) - $time_start) . "</p>";
最佳答案
如果您的目标是在一页中显示所有 1000 行,也许您可以按部分加载它。当页面打开时显示 100 行,当使用 AJAX 向下滚动时加载更多。
第一部分
$sql = "SELECT id,content FROM child_pages WHERE scanned='1' AND processed='0' LIMIT 0,100";
第二部分
$sql = "SELECT id,content FROM child_pages WHERE scanned='1' AND processed='0' LIMIT 100,200";
等等...
希望有帮助。
关于php - 如何保证从 SELECT 查询中获取 1000 行? MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38146143/
在 的 React 组件中菜单,我需要设置selected反射(reflect)应用程序状态的选项的属性。 在 render() , optionState从状态所有者传递给 SortMenu 组件
我是初级 Ruby-mysql 程序员,我想知道如何使我的(存储过程)查询结果更快.. 这是我的存储过程我正在使用 SQL_CACHE.. 但我不确定.. 缓存使我的过程更快.. : ( DROP
我一直在 Python 中进行套接字编程,以使用 select.select(rfile, wfile, xlist[, timeout]) 处理由已连接的客户端套接字列表发出的请求,并且我还想用 J
我试图通过用空格填充文本来创建下拉列表中的列效果,如下例所示: [Aux1+1] [*] [Aux1+1] [@Tn=PP] [Main] [*] [Main A
我为 MySQL 编写了以下查询: SELECT subquery.t1_column1, subquery.t2_id, MAX(subquery.val) FROM ( S
为什么我们要用 select 标签来编写.attr('selected','selected') 例如: $('#countryList option').filter(function () {
Lokalizacja: Gdańsk Rzeszów Wrocław 不知道发生了什么,但在那种情况下没有选择的选项,我必须从列表中选择一些东西。当我从选
我的表单中有两个选择字段。第一个是单选,另一个是多选。现在我想做的是根据单选中所选的选项,使用给定的数据选择多选中的选项。为此,我在单选更改时触发 ajax 请求: $.ajax({ type
我在 Firefox 5 中发现了一个奇怪的错误(我现在无法访问 4)。但是,我认为它可能在 Firefox 4 中工作,因为我刚买了一台新电脑,而且我不记得以前见过这个错误。 我有几个选择框。所选值
此 SQL 有何不同: 第一个: select * from table_1 a join table_2 b on a.id = b.acc_id 第二个: select * f
预选 的最佳做法是什么?在 ? 根据不同的网站,两者都有效。但是哪个更好呢?最兼容? Foo Bar 最佳答案 如果您正在编写 XHTML,则 selected="selected" 是必需的。 如
我使用 Angular JS 创建了一个多选选择框:下面是相同的代码: JS: $scope.foobars = [{ 'foobar_id': 'foobar01', 'name':
我在 jqGrid 中有几列 edittype="select"。如何读取特定行中当前选定值的选项值? 例如:当我提供以下选项时,如何获得 FedEx 等的“FE” editoption: { val
这是我更大问题的精简查询,但要点是我试图内部联接到一个选择,其中选择受到外部选择的限制。那可能吗?我在内部选择上收到有关多部分标识符 S.Item 和 S.SerialNum 的错误。 要点是这样的,
如果chat.chat_type IS NULL,我想选择user.*,但如果chat.chat_type = 1 我想选择组。* SELECT CASE WHEN ch
我正在编写一个小脚本来测试表单在提交之前是否已被更改。所以我可以使用普通输入(文本、文本区域等): if(element.defaultValue != element.value) { al
我正在尝试为 Prototype 编写一个插件,用户在其中单击下拉菜单并将其替换为多选元素。我快完成了。在用户选择他们想要显示的内容并将表单提交到同一页面之前,一切都很好。我正在使用 PHP 来使用
你如何在 MongoDB 中进行嵌套选择,类似于 SELECT id FROM table1 WHERE id IN (SELECT id FROM table2) 最佳答案 MongoDB 尚不具备
我有以下用于选择下拉列表的代码: {{unit.Text}} UnitOfMeasurements 数组中的每一项看起来像这样: Selected: false Text: "lb" Va
我正在尝试使用[选定]和[ngValue]来设置表单中包含对象的选择标记的默认值。但出于某种原因,它们似乎无法相提并论。。示例代码:。这段代码最终只显示空白作为缺省值。如果删除[ngValue],它就
我是一名优秀的程序员,十分优秀!