SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.05.2010 03:02:08

Atapin
Участник
Зарегистрирован: 24.05.2010
Сообщений: 3

вывод данных "шиворот-навыворот"

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

хм, даже и не знаю как описать то верно..

поле ID добавляется автоматически, с этом все ок.
Но при запросе потом в таблицу, данные выдает так, если бы стояла сортировка order by id desc
И если смотреть таблицу в phpMyAdmin, то же самое, строки в обратном порядке.
Притом добавленные ранее строки расположено как и нужно по id
смотрится странно...
к примеру:

эти строки добавлены ранее
ID | Name
1    name1
2    name2
3    name3

а тут строки добавленные позже

7    name7
6    name6   
5    name5
4    name4


Выстраивается все как положено только если сортировку указать принудительно.

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


Где я прогулял уроки, когда это рассказывали? :)

PS:

Данные для добавления в базу берутся из текстовых файлов.
Функция читает построчно файл, и каждую строку, после перекодирование её в UTF8, добавляет соответственно в новую строку таблицы.

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

Неактивен

 

#2 24.05.2010 14:30:29

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: вывод данных "шиворот-навыворот"

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

Следовательно, смотрите функцию, которая их разбирает. И далее...

Притом добавленные ранее строки расположено как и нужно по id
смотрится странно...

Насколько я знаю, порядок добавления в БД никто не гарантирует. И порядок выборки, также.
Поэтому, надо указывать сортировку.

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

Другого варианта, без извращений, - нет.
Зачем вам выбирать миллион строк каждый раз?
Вы думаете, что пользователь их все охватит одним взглядом?
Или вы делаете с ними что-то такое, что не может сделать сервер?

Как вариант, есть LIMIT.


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#3 24.05.2010 15:25:24

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: вывод данных "шиворот-навыворот"

Для MyISAM есть специальная операция:

ALTER TABLE mytable ORDER BY id;

Но порядок может сбиваться при каждой вставке.

Неактивен

 

#4 24.05.2010 15:27:20

Atapin
Участник
Зарегистрирован: 24.05.2010
Сообщений: 3

Re: вывод данных "шиворот-навыворот"

Артём Н. написал:

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

Следовательно, смотрите функцию, которая их разбирает. И далее...

Притом добавленные ранее строки расположено как и нужно по id
смотрится странно...

Насколько я знаю, порядок добавления в БД никто не гарантирует. И порядок выборки, также.
Поэтому, надо указывать сортировку.

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

Другого варианта, без извращений, - нет.
Зачем вам выбирать миллион строк каждый раз?
Вы думаете, что пользователь их все охватит одним взглядом?
Или вы делаете с ними что-то такое, что не может сделать сервер?

Как вариант, есть LIMIT.

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


что вы имеете ввиду "порядок добавления в БД никто не гарантирует"
порядок добавления гарантирует auto_increment.

А вот о выборке таки да, в доку стоит что может не соответствовать, однако на практике почти всегда все ок.
Так что я не против сортировке, но интересен сам факт такого "изнаночного" добавления строк.


smile
да...
нет конечно, и в страшном сне мне не привидится пытаться загрузить в скрипт миллион строк...
Но вообще то, если вы указали order by то от общего количества строк, независимо от LIMIT, напрямую зависит время запроса.

Неактивен

 

#5 24.05.2010 15:36:03

Atapin
Участник
Зарегистрирован: 24.05.2010
Сообщений: 3

Re: вывод данных "шиворот-навыворот"

rgbeast написал:

Для MyISAM есть специальная операция:

ALTER TABLE mytable ORDER BY id;

Но порядок может сбиваться при каждой вставке.

О! Спасибо. Выход есть smile
Хотя я уже во все запросы, где было необходимо добавил order by.

Но это выход. Так как можно просто в скрипт прописать запрос типа

ALTER TABLE mytable ORDER BY id;
после добавления данных.

Спасибо!

rgbeast написал:

Но порядок может сбиваться при каждой вставке.

И о теории, есть где почитать об этом?

Неактивен

 

#6 24.05.2010 17:16:11

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: вывод данных "шиворот-навыворот"

Теория очень простая — MyISAM вставляет строки в освободившиеся после DELETE
место, если оно есть, и в конец, если его нет smile

А ORDER BY — это правильно, т.к. без него никто, разумеется, не гарантирует пра-
вильный порядок строк.

Неактивен

 

#7 24.05.2010 21:33:15

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: вывод данных "шиворот-навыворот"

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

Вы не говорили про функцию. Вы говорили про файлы:

Atapin написал:

Сначала я думал, что что то в файлах, однако одни и те же файлы,
одни раз парсятся и добавляются в базу  "шиворот-навыворот",  а иной раз
правильно

Конечно, вопрос к функции возникает сам собой, однако не думаю.

Функция, прежде всего.

что вы имеете ввиду "порядок добавления в БД никто не гарантирует"
порядок добавления гарантирует auto_increment.

ID автоинкрементный?
В любом случае, как я понимаю, порядок вставки не гарантируется.
Автоинкремент значит примерно следующее:
"Запись, которая будет вставлена, получит текущее значение счётчика.
Затем, счётчик будет увеличен."

И всё. Никто не говорит где будет вставлена запись.
И после какой записи она последует.
Если, я не ошибаюсь, конечно.

однако на практике почти всегда все ок.

Ну да, видимо, сейчас как раз тот случай, когда это не так.

Но вообще то, если вы указали order by то от общего количества строк,
независимо от LIMIT, напрямую зависит время запроса.

Ну да. Только вряд ли очень сильно. Хотя, я не знаю.

ALTER TABLE mytable ORDER  BY id;

Но это выход. Так как можно просто в скрипт прописать запрос типа
ALTER TABLE mytable ORDER BY id;
после добавления данных.

Сомневаюсь, что это выход.
Во-первых, не факт, что это будет быстрее, чем ORDER BY.
Во-вторых, ALTER TABLE - не очень хорошая идея.

Отредактированно Артём Н. (24.05.2010 21:34:48)


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson