Но тут заметил что это не так, новая строка встала предпоследней.
Как на самом деле добавляются строки? Каков алгоритм?
Спустя 1 час, 2 минуты, 29 секунд (26.03.2011 - 03:23) kirik написал(а):
Воитель
В СУБД нет первых и последних строк, пока не произведена сортировка. Так же если заглянуть в pma на страницу редактирования таблицы (выбираем таблицу и нажимаем закладку Operations) там будет Alter table order by - тут можно указать как будут сортироваться записи в таблице по умолчанию (только вроде до первой записи в таблицу).
В СУБД нет первых и последних строк, пока не произведена сортировка. Так же если заглянуть в 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) | ||||
Зачем перед записью-то? Сортировать нужно при выводе. Как лежат в БД данные нам, как конечным пользователям, не важно. Если нужно вытащить последнюю запись, то нужно инкриментное поле и запрос: SELECT ... FROM `table` ORDER BY `id` DESC LIMIT 1 где id - то самое инкриментное поле.
Ага.. и довольно не простой. Советую почитать по теме "теория реляционных баз данных". Или 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 раз.
У меня на самом деле всё работает, но я не совсем догоняю как это работает.
Я уж не помню точно.
И тогда зачем сортировать каждый раз через селест, может лучше сортировать при добавлении новой записи, всю таблицу, но зато 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
Тогда лучше брать 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)
В большинстве других СУБД Вы его не увидите.
Впрочем, я уже понял, что Вам бесполезно что-то дельное втолковывать.
Попутного ветра в горбатую спину, как грицца...
Использовать его для формирования логики работы приложения - отдельная бредятина.
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) В большинстве других СУБД Вы его не увидите. Впрочем, я уже понял, что Вам бесполезно что-то дельное втолковывать. Попутного ветра в горбатую спину, как грицца... |
Я достаточно обучаемый.
Просто между вами и мной есть огромная разница.
Для меня веб это хобби. Занимаюсь им по мере возможности, как время позволяет. По этому на форуме я старик, и всё ещё задаю вопросы а не отвечаю на них.
Многие вещи со временем я забываю, т.к. постоянно с этим не работаю.
Я вообще-то студен, пятого курса со строительной специальностью "Теплогазоснабжение и Вентиляция"
Так что не судите строго.
_____________
Вечно учусь.