Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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 PDO在MySQL中无顺序向后搜索_Php_Mongodb_Pdo_Indexing - Fatal编程技术网

PHP PDO在MySQL中无顺序向后搜索

PHP PDO在MySQL中无顺序向后搜索,php,mongodb,pdo,indexing,Php,Mongodb,Pdo,Indexing,我有一个很大的mysql表,我需要得到最新的1000行,这些行符合一个条件。最明显的方法就是这样做 try { $stmt = $dbh->prepare("SELECT id, date, field1, field2 FROM big_ass_table WHERE field1 >= 1000 and field2 <=4550 ORDER BY date DESC LIMIT 0,1000"); $stmt->execut

我有一个很大的mysql表,我需要得到最新的1000行,这些行符合一个条件。最明显的方法就是这样做

try {
    $stmt = $dbh->prepare("SELECT id, date, field1, field2 
    FROM big_ass_table
    WHERE field1 >= 1000 and field2 <=4550
    ORDER BY date DESC LIMIT 0,1000");
    $stmt->execute();
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        print_r($row);
    }
    $stmt = null;
} catch (PDOException $e) {
    print $e->getMessage();
}
尽管我越来越喜欢MongoDB,但是有很多理由继续使用mysql来完成这项任务,所以我希望mysql,特别是PDO mysql,有一种方法可以向后搜索

根据:

索引列名称规范可以以ASC或DESC结尾。这些关键字允许在以后的扩展中指定升序或降序索引值存储。目前,它们被解析但被忽略;索引值始终按升序存储

所以我在这里处于绝境。然后我求助于PDO。有没有可能让它和这样的东西一起工作

try {
    $stmt = $dbh->prepare("SELECT id, date, field1, field2 
    FROM big_ass_table
    WHERE field1 >= 1000 and field2 <=4550
    LIMIT 0,1000", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_LAST);
    do {
      print_r($row);
    } while ($row = $stmt->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_PRIOR));
    $stmt = null;
}   catch (PDOException $e) {
    print $e->getMessage();
}

注意,我已经从上一个中删除了ORDER子句。我相信通过这种方式,我仍然可以捕获前1000行,然后将它们向后打印,这不是我需要做的。?如果我删除LIMIT子句,然后在达到1000行时手动关闭光标,可能会起作用?还是我会使数据库引擎过载?

至少有两个技巧可以加快查询速度

添加一些使用索引的条件,同时减少要排序的行数。比如说,在某个特定的日期限制,而这个日期保证超出范围。 创建一个反向索引,即unix时间戳,但它是一个否定的索引,前面有-。通过这种方式,您将按数据建立索引,但顺序相反。不要忘记将此字段设置为带符号的int类型。
在这种情况下,我通常会做什么:

1,从条件所在的表中选择MINid作为MINU id

2,从条件所在的表中选择MAXid作为max_id


3、从表中选择*,其中id>=min\u id和id只是MongoDB端的一些提示-您不需要$,因为它是默认值,您应该避免提示-只是排序{date:-1};我不会读任何关于mysql中索引的东西吧?您的mysql数据定义是什么?也许更好的索引可以在不去mongo的情况下解决您的问题…@Derick我实际上通过暗示比mongo中的排序速度更快,但差别可以忽略不计。@Nanne,数据定义是id、日期、文本、纬度、经度、几何体,也就是POINTlatitude,但是你错过了关键点:你在mysql中索引了哪些字段?我相信这是可行的,但我会把3个查询排成队列,而不是一个查询。不知道会发生什么。根据分区,我必须在文本字段上删除全文索引,这是我搜索中的条件之一。通常我在边界几何框中查询匹配的文本。我认为我无法事先缩小搜索范围,但我非常喜欢第二个选项。我就选那个!谢谢工作得很有魅力。另外,在整数字段上建立索引比在时间戳上建立索引要便宜得多。
try {
    $stmt = $dbh->prepare("SELECT id, date, field1, field2 
    FROM big_ass_table
    WHERE field1 >= 1000 and field2 <=4550
    LIMIT 0,1000", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_LAST);
    do {
      print_r($row);
    } while ($row = $stmt->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_PRIOR));
    $stmt = null;
}   catch (PDOException $e) {
    print $e->getMessage();
}