我有一個大屁股MySQL表,我需要得到滿足的條件是最近的1000行。顯而易見的方法是做PHP PDO搜索倒着MySQL中無秩序
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();
}
但這張表已經是15M行,臨時排序按日期是永遠。將它作爲unix時間戳整數也沒有多大幫助。
我使用MongoDB的完成這個任務,建設與日期順序相反的指標試圖做的伎倆,沒有任何的排序:
$cursor=$mongodb->big_ass_table
->find(array('$and'=>array($conditions)))
->hint("date_-1")
->limit(1000);
有許多原因用mysql這個任務(保持雖然我長大的MongoDB越來越喜歡),所以我希望有一個對MySQL的方式,特別是PDO MySQL和向後搜索。
的index_col_name規約可以與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行將工作?或者我會超載數據庫引擎?
只是在MongoDB端的一些提示 - 你不需要''和'',因爲它是默認的,你應該避免''提示()'' - 只是一個'sort({date:-1});''會做詭計。 – Derick
我沒有閱讀關於mysql中索引的任何內容?什麼是你的MySQL數據定義?也許更好的指數將解決您的問題,而不會去mongo ... – Nanne
@Derick我實際上比使用mongo進行排序時實現更好的提示速度,但差異可以忽略不計。 – amenadiel