2013-05-28 3 views
3

Итак, я знаю, что в реляционных базах нет такой вещи, как «последняя строка», но я не мог найти лучшего слова, чтобы объяснить, что я хочу делать. У меня есть таблица, которая выглядит следующим образом: id - это поле AUTO_INCREMENT, а time - текущая временная метка Unix. Обратите внимание, что я могу иметь один и тот же штамп времени для разных строк.Поиск таблицы mysql, начиная с последней строки

╔════╦════════════╦════════════╦═════════════╦════════════╗ 
    ║ id ║ field_1 ║ field_2 ║ field_n ║ time ║ 
    ╠════╬════════════╬════════════╬═════════════╬════════════╣ 
    ║ 1 ║ data_field ║ data_field ║ data_field ║ 1369748934 ║ 
    ║ 2 ║ data_field ║ data_field ║ data_field ║ 1369748935 ║ 
    ║ 3 ║ data_field ║ data_field ║ data_field ║ 1369748936 ║ 
    ║ 4 ║ data_field ║ data_field ║ data_field ║ 1369748936 ║ 
    ║ 5 ║ data_field ║ data_field ║ data_field ║ 1369748938 ║ 
    ║ 6 ║ data_field ║ data_field ║ data_field ║ 1369748939 ║ 
    ╚════╩════════════╩════════════╩═════════════╩════════════╝ 

То, что я хочу сделать, это выбрать, что начинает поиск с самого высоким time поля и, так как я знаю, что это сортируется от самого низкого до самого высокого, я хочу, чтобы остановить поиск, когда первый ряд не Маха моего положения WHERE потому что все остальные строки тоже не совпадают. Я думаю, что MySQL выполняет поиск по всем строкам, но так как я знаю свою структуру данных, и я знаю местоположение данных, которые я хочу, мне не нужно искать по всей таблице. Кроме того, если я использую ORDER BY, я считаю, что все содержимое моего предложения WHERE будет выполнено первым, так что я буду заниматься в основном поиском всего набора строк, а затем заказать его. Одна важная вещь: я не знаю, сколько строк будет извлечено для использования предложения LIMIT.

Это пример запроса:

SELECT fields FROM table WHERE time > timestamp 

Так что я хочу, чтобы получить все результаты, начиная с указанной даты до сих пор.

Большое спасибо за помощь.

+0

Вы пытались сделать двойной первичный ключ, состоящий из идентификатора и метки времени? Вы * хотите * делать WHERE перед ORDER BY, поскольку WHERE является операцией O (n) (быстрее с индексами, см. Http://stackoverflow.com/a/13362951/431415). – SubSevn

+0

Я думаю, что вы имеете в виду временную метку и идентификатор (в этом порядке), в противном случае каждая строка все равно нуждается в поиске. – mcNux

+0

@Vinicius Была ли эта проблема решена? –

ответ

1

То, что я хочу сделать, это выбрать, что начинает поиск с самого высокого временного поля и, так как я знаю, что это сортируется от самого низкого до самого высокого, я хочу, чтобы остановить поиск, когда ...

I действительно не думаю, что вы можете сказать MySQL прекратить запрос после выполнения определенного условия.

На самом деле, я действительно не думаю, что вы тоже должны заботиться. Запрос - это работа с базой данных, и это очень хорошо. Если это вопрос производительности, вы не должны видеть никакой разницы до многих столетий :)

2

То, о чем вы просите, является индексом. Я предлагаю вам провести некоторое исследование того, как работают индексы b-tree.

Если у вас есть указатель на поле времени, двигатель будет по существу делать то, о чем вы просите - поскольку индекс будет заказан, он «знал бы», что ему нужно только найти самую раннюю точку, просить и вернуть все после него.

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

2

Просто поместите указатель на поле метки времени. Mysql позаботится об этом для вас.

Смежные вопросы