[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Добавление новых строк
Воитель
Я всю жизнь думал, что новая добавленная строка в MySQL встаёт всегда в конец таблицы.
Но тут заметил что это не так, новая строка встала предпоследней.

Как на самом деле добавляются строки? Каков алгоритм?





Спустя 1 час, 2 минуты, 29 секунд (26.03.2011 - 03:23) kirik написал(а):
Воитель
В СУБД нет первых и последних строк, пока не произведена сортировка. Так же если заглянуть в pma на страницу редактирования таблицы (выбираем таблицу и нажимаем закладку Operations) там будет Alter table order by - тут можно указать как будут сортироваться записи в таблице по умолчанию (только вроде до первой записи в таблицу).

Спустя 1 час, 30 минут, 52 секунды (26.03.2011 - 04:54) Воитель написал(а):
Не совсем понял про "по умолчанию"
Сортировать то я умею. Не об этом разговор.
Не ужели перед каждой новой записью надо сортировать? Что бы сохранить упорядочивание данных.
У БД наверняка есть какой-то алгоритм добавления новых записей. Не по рандому же она их втыкает. Хотя даже святой рандом предсказуем.


Спустя 40 минут, 56 секунд (26.03.2011 - 05:35) kirik написал(а):
Цитата (Воитель @ 25.03.2011 - 20:54)
Не ужели перед каждой новой записью надо сортировать?

Зачем перед записью-то? Сортировать нужно при выводе. Как лежат в БД данные нам, как конечным пользователям, не важно.
Если нужно вытащить последнюю запись, то нужно инкриментное поле и запрос:
SELECT ... FROM `table` ORDER BY `id` DESC LIMIT 1

где id - то самое инкриментное поле.

Цитата (Воитель @ 25.03.2011 - 20:54)
У БД наверняка есть какой-то алгоритм добавления новых записей.

Ага.. и довольно не простой. Советую почитать по теме "теория реляционных баз данных". Или mysql'ный талмуд он хоть и по 4-й версии, но помогает разобраться в принципах и тонкостях.

Спустя 3 часа, 42 минуты, 40 секунд (26.03.2011 - 09:18) Trianon написал(а):
Цитата
У БД наверняка есть какой-то алгоритм добавления новых записей. Не по рандому же она их втыкает. Хотя даже святой рандом предсказуем.


У БД может много чего быть, но если Вы хотите работать с БД как с БД, то не должны опираться на такие знания.
Для клиента реляционная база устроена так, что ему безразлично, в каком порядке физически лежат строки. И кстати, в каком порядке объявлены поля в строке - тоже.
Считайте, что строки лежат даже не случайно, а просто внавал.

Спустя 6 часов, 39 минут, 11 секунд (26.03.2011 - 15:57) Воитель написал(а):
Цитата (kirik @ 26.03.2011 - 07:35)
Цитата (Воитель @ 25.03.2011 - 20:54)
Не ужели перед каждой новой записью надо сортировать?

Зачем перед записью-то? Сортировать нужно при выводе. Как лежат в БД данные нам, как конечным пользователям, не важно.
Если нужно вытащить последнюю запись, то нужно инкриментное поле и запрос:
SELECT ... FROM `table` ORDER BY `id` DESC LIMIT 1

где id - то самое инкриментное поле.

Цитата (Воитель @ 25.03.2011 - 20:54)
У БД наверняка есть какой-то алгоритм добавления новых записей.

Ага.. и довольно не простой. Советую почитать по теме "теория реляционных баз данных". Или mysql'ный талмуд он хоть и по 4-й версии, но помогает разобраться в принципах и тонкостях.

А вот если надо вытащить последних 20 например для постраничной навигации?
То тогда как быть?

SELECT ... FROM `table` ORDER BY `id` DESC LIMIT 20,47


Не даст именно последних 20


P.S. в примере 67 строк

Спустя 1 час, 20 минут (26.03.2011 - 17:17) Trianon написал(а):
Цитата
А вот если надо вытащить последних 20 например для постраничной навигации?
То тогда как быть?
SELECT ... FROM `table` ORDER BY `id` DESC LIMIT 20,47
Не даст именно последних 20


Это не просто 20 последних, а 20 последних по порядку id записей.

И получить их можно как

SELECT ... FROM `table` ORDER BY `id` DESC LIMIT 20

Цитата
P.S. в примере 67 строк

67 строк вовсе не должны приходиться на id 1...67

Спустя 1 час, 50 минут, 44 секунды (26.03.2011 - 19:08) Воитель написал(а):
Где-то читал что ORDER BY при LIMIT 20,40 сортирует не всю базу, а только ту часть что до этих самых 20 или только те самые 20 сортирует.

Я уж не помню точно.

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

У меня на самом деле всё работает, но я не совсем догоняю как это работает.

Спустя 35 минут, 44 секунды (26.03.2011 - 19:43) Trianon написал(а):
Цитата
Где-то читал что ORDER BY при LIMIT 20,40 сортирует не всю базу, а только ту часть что до этих самых 20 или только те самые 20 сортирует.


LIMIT 20, 40 означает сорок записей начиная с 21-й по счету, а вовсе не то, что Вы думаете.

Отсортировать придется всё. Иначе не получится определить место этой двадцатки в диапазоне.
Цитата
И тогда зачем сортировать каждый раз через селест, может лучше сортировать при добавлении новой записи, всю таблицу, но зато 1 раз.


Сортируется не таблица, а лишь результат выборки данных из нее.
Сама таблица порядком строк не обладает.

Цитата
У меня на самом деле всё работает, но я не совсем догоняю как это работает.


Без ORDER BY у Вас работает ровно до тех пор, пока Вы не начнете удалять записи и добавлять новые.

Спустя 2 часа, 35 минут, 47 секунд (26.03.2011 - 22:19) Воитель написал(а):
про лимит я в курсе.
Тогда лучше брать ORDER BY не при селесте
а при
ALTER TABLE `...` ORDER BY `...`

Так по крайней мере она будет сортироваться 1 раз при добавлении новой записи.


Меня смутила вот эта строчка:
Если LIMIT # используется с ORDER BY, MySQL закончит сортировку, как только найдет первые # строк, вместо того, чтобы сортировать всю таблицу.

из
http://www.codenet.ru/db/mysql5/manual.ru_...ptimisation.php

Спустя 1 час, 6 минут, 33 секунды (26.03.2011 - 23:26) Trianon написал(а):
ALTER TABLE - оператор из раздела не DML , а DAL .
Использовать его для формирования логики работы приложения - отдельная бредятина.

ALTER TABLE `...` ORDER BY `...`- вообще есть лишь в MySQL ( и возможно лишь в MyISAM)
В большинстве других СУБД Вы его не увидите.

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

Спустя 1 час, 41 минута, 45 секунд (27.03.2011 - 01:07) kirik написал(а):
Цитата (Воитель @ 26.03.2011 - 14:19)
Если LIMIT # используется с ORDER BY, MySQL закончит сортировку, как только найдет первые # строк, вместо того, чтобы сортировать всю таблицу.

Всё верно, НО это верно пока сортировка производится по индексированному полю. Тоесть СУБД "знает" про расположение строк, пока в строках есть индекс.
Если order by используется по не проиндексированному полю, то СУБД будет сортировать всю таблицу, и в explain мы получим "using filesort" в лучшем раскладе.
Воитель
почитайте 5-ю главу чтобы понять, как именно СУБД оптимизирует свою работу.

Спустя 42 минуты, 4 секунды (27.03.2011 - 01:50) Воитель написал(а):
Цитата (Trianon @ 27.03.2011 - 01:26)
ALTER TABLE  - оператор из раздела  не DML , а DAL .
Использовать его для формирования логики работы приложения - отдельная бредятина.

ALTER TABLE  `...` ORDER BY `...`- вообще есть лишь в MySQL ( и возможно лишь в MyISAM)
В большинстве других СУБД Вы его не увидите.

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

Я достаточно обучаемый.
Просто между вами и мной есть огромная разница.

Для меня веб это хобби. Занимаюсь им по мере возможности, как время позволяет. По этому на форуме я старик, и всё ещё задаю вопросы а не отвечаю на них.
Многие вещи со временем я забываю, т.к. постоянно с этим не работаю.

Я вообще-то студен, пятого курса со строительной специальностью "Теплогазоснабжение и Вентиляция"
Так что не судите строго.


_____________
Вечно учусь.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.