2012-04-11 3 views
0

Я знаю, что команда «limit» используется для разбивки на страницы на веб-сайтах.
Интересно, может ли DB найти начальный индекс без линейного перехода по результирующему набору.Как работает команда sql 'limit' под капотом?

Например, для запроса «Найти что-то между 100-м и 120-м» у БД есть способ найти 100-й элемент запроса, не переходя через 100 элементов линейно?

Если это действительно необходимо для линейного поиска, я думаю, что разбиение на страницы, которое я вижу на каких-либо крупных сайтах, не выполняется простой командой «limit»?

+0

Я думаю, что это зависит от поставщика. – kosa

ответ

0

Не говоря о конкретных реализациях, есть определенные структуры данных, которые поддерживают мгновенный поиск, основанный на смещениях. Подумайте о нормальных C-массивах целых чисел, структур и указателей (возможно, указывая на структуры).

Помимо того, что реляционные базы данных имеют множество схем кэширования, поэтому даже если первый поиск занимает некоторое время, последующие запросы могут значительно ускоряться.

В случае фактических реализаций вы должны всегда указывать BY и LIMIT на индексированном столбце.

+0

Ой и даже используя индексы, используя большие смещения LIMIT, такие как 1000 или 5000, будут медленнее. Индексы используют B-деревья. –

+0

Ваш комментарий (о больших смещениях, приводящих к медленной выборке), и ответ (мгновенный поиск), похоже, сталкиваются. Могу ли я считать, что это будет медленно на обычных столбцах с индексом B-дерева? – eugene

+0

Я предварял его «без разговора о конкретных реализациях», я просто указывал, что есть некоторые структуры данных, которые могут прыгать, чтобы сказать 10000-й элемент так быстро, как требуется, чтобы добраться до второго элемента. Он будет быстрее, чем линейный, но он будет медленнее для более глубоких индексов. –

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