Общие вопросы об MySQL.

BabyKiller

Guest
Общие вопросы об MySQL.

Как по быстрому создавать записи?
Я использую такую конструкцию, посылая через mysql_query: INSERT INTO `train` VALUES('',$num_train,'2005-01-$date_of_start')
Но она долго работает, мне надо создать таким образом 15 миллионов записей, приходится ждать чуть ли не полчаса, быстрее никак?

И тот же самый вопрос, только при операции SELECT, у меня запрос выполняется секунд 30 :( Что можно сделать? Уменьшить размер таблицы???

И ещё, как быстрее можно сосчитать кол-во строк в таблице? Я использую SELECT count(*) - Это быстрый способ?

Кароче где можно почитать инфу насчёт того, как менее загрузить сервер, в каких случаях какие лучше конструкции использовать, или какие встроенные функции PHP.... Заранее благодарен!!!!!!
 

MuXa247

Новичок
Хоть бы структуру таблицы привел... :rolleyes:
На счет добавления... года 4 назад, ежемесячно грузил в БД Informix несколько миллионов записей... для ускорения процесса приходилось убивать все индексы, грузить данные и создавать индексы заново. Такая конструкция работала(вместе с убиванием и созданием индексов) в 4 раза быстрее, чем при сохраненной структуре(было около 5-6 индексов по разным полям).
Структуру таблицы в студию, а там посмотрим! ;)
 

BabyKiller

Guest
$num=mysql_result(mysql_query("SELECT count(*) FROM `place`"),0);
for($i=1;$i<$num+1;$i++)
{
$v=mysql_result(mysql_query("SELECT id_vagon FROM `place` WHERE id_place=$i"),0);
$t=mysql_result(mysql_query("SELECT id_train FROM `vagon` WHERE id_vagon=$v"),0);
$nt=mysql_result(mysql_query("SELECT num_train FROM `train` WHERE id_train=$t"),0);
$nsr=mysql_query("SELECT num_st FROM const_info.marshrut WHERE num_train=$nt");
$max_st=mysql_num_rows($nsr);
for($num_st=1;$num_st<$max_st+1;$num_st++)
mysql_query("INSERT INTO `station` VALUES('',".mysql_result($nsr,$num_st-1).",$i,'');");
}
Немного разьясню:
$num - кол-во строк в таблице place, относительно которого я строю новую таблицу. Итого в ней строк 529,560.
$v=SELECT id_vagon FROM `place` WHERE id_place=$i
$t=SELECT id_train FROM `vagon` WHERE id_vagon=$v
$nt=SELECT num_train FROM `train` WHERE id_train=$t
$nsr=SELECT num_st FROM const_info.marshrut WHERE num_train=$nt
Четыремя верхними строчками я сопоставляю каждой моей новой записи значение num_st которое ещё берётся из другой базы. Т.е. я как бы иду по иерархии, чтобы добраться до нужного мне значения. И вот, одному значению id_place соответствует множество значений num_st....
Далее я пишу ещё один вложенный цикл, и вгоняю данные в таблицу.
Надеюсь всё понятно :) Если нет, то скажите хотяб, что сильнее всего тормозит сервер????

Кстати MuXa247, индексы я не использую, а может как раз и надо, а то у меня при запросе на таблицу в 15000000 записей приходится секунд 30 ждать? Или нет? Просто я индексы ещё не разу не использовал, так где-то слышал, поэтому сильно не пинайте, новичёк я в этом деле :)))

P.S.: Если кому интерестно, это я курсач делаю, для справочной ЖД. Делаю всё максимально приближенной к реальности :)
 

MuXa247

Новичок
Проиндексируй и код перепиши, он ужасен... Почитай про вложенные SQL запросы и вообще как работать в ПХП с MySQL...
И вообще тут можно одним SQL запросом все заинсертить, при условии что в stations есть auto_increment. Надо просто перевязать между собой твои таблицы.
insert into station (select t1.field, t2.field from table1 t1, table2 t2 where t1.id=t2.id )
 

Фанат

oncle terrible
Команда форума
Этот вопрос кстати надо отобразить в факе, но я никак слов правилных не найду.
если людиэтого не понимают изначально, объяснить им обычно не удается.
что бд хранит данные абстрактно.
что любые данные можнг ВЫЧИСЛИТЬ, и их не обязательно
ХРАНИТЬ, ЗАРАНЕЕ забивая в базу.

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

BabyKiller

Guest
Фанат, я то как раз и создаю новую базу из одного базового набора, т.е. с одной базы называемой const_info я создаю новую - var_info.

И ещё вопрос о вводе данных в таблицу: подскажите, как пользоваться коммандой LOAD DATA, вернее как должен быть сформирован сам файл, и вообще обоснованно ли его использовать вместо INSERT?
 

Фанат

oncle terrible
Команда форума
и где же это у меня написано, что надо создавать одну бд на основании другой?
может, не надо перевирать мои слова, да?
У меня написано совсем НАОБОРОТ
 

BabyKiller

Guest
Фанат, ну может я тебя чуть неправильно и понял, а что бы меня правильно понял, распишу всё по пунктам:

1) База const_info - База справочно ЖД, содерижит три таблицы:

"train" - Содержит уникальный номер поезда (маршрута) [num_train], класс поезда [klass_train], число отправки поезда [date_of_start], кратности движения поезда [kratnost], и имя маршрута [name_m]. Таблица содержит 30 записей.

"marshrut" - Хранит в себе маршруты движения всех поездов. Определённый поезд [num_train] данные которого берутся из таблицы "train", уникальный номер станции [num_st], имя станции [name_st], расстояние до следующей станции (равна 0, если станция конечная) [distance], [time_come] и [time_left] соответственно содержат данные о времени прибытия и отправки с этой станции определённого поезда. Таблица содержит 816 записей.

"station" - Просто информационная таблица (соедржит все уникальные имена станций), которая содержит одно поле [name_st], берётся из таблицы "marshrut" запросом SELECT `name_st` FROM `marshrut` GROUP BY `name_st`. Таблица содержит 94 записей.

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

2) Создаём базу var_info - содержит в себе все записи о движении поездов за текущий месяц, в том числе и информацию о занятости определённых мест. Т.е. получается, что эта база данных всё время изменяется например кассирами, которые продают билеты, и сразу же забивают ряд мест с одной станции до другой, для определённого номера маршрута, и определённого дня.

"train" - [id_train] - уникальный номер поезда, [num_train] - номер маршрута следования, [date] - дата отправления. Таблица содержит 610 записей.

"vagon" - [id_vagon] - уникальный номер вагона, [id_train] - номер поезда, [num_vagon] - номер вагона в конкретном поезде, [klass] - класс вагона. Таблица содержит 12,180 записей.

"place" - [id_place], [id_vagon], [num_place] - номер места в конкретном вагоне. Таблица содержит 529,560 записей.

"station" - [id_st] - уникальный номер станции, [num_st] - номер станции берётся из `const_info`.`marshrut`, [id_place], [status] - статус места т.е. его занятость. Таблица содержит почти 15 миллионов записей.

Итак, надеюсь не зря я здесь расписался :), это для прояснения ситуации. База var_info по идее создаятся каждый раз для нового месяца, и содержит статус всех места как свободные.

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

Фанат

oncle terrible
Команда форума
а зачем создавать пустую базу?
почему не создавать ее, как все нормальные базы, заполняя, по мере поступления информации?
 

BabyKiller

Guest
Как я понял, пустой базой ты называешь var_info?

Как ты написал: "заполняя, по мере поступления информации", информация здесь, это информация о занятости места. Т.е. по твоему я должен по мере продаж билетов заполнять базу (хотя она и так полная, просто содержит в себе данные, что все места свободны)?
Это можно будет сделать, но это будет очень тяжело, а надо ли?, если сначала можно создать базу, а потом её на протяжении месяца изменять?
Тяжело это будет потому, что даже перед продажей билета я должен знать поедет ли определённый поезд в определённый день, если да, то проверить а не занято ли хоть одно место на заданном маршруте, и если нет, только потом вбивать в базу данные о занятости этих мест. - Это я развил мысль, если вбивать данные по мере поступления.
И стоит ли игра свеч? Я даже не знаю, смогу ли я написать вышенаписанное, думаю что смогу, но стоит ли делать как ты сказал? Только не пиши что как ты сказал, так и правильно, потому что ошибаться не можешь. Здраво рассуди и напиши, как ты думаешь как лучше поступить.
 

Фанат

oncle terrible
Команда форума
перед продажей билета я должен знать поедет ли определённый поезд в определённый день, если да, то проверить а не занято ли хоть одно место на заданном маршруте, и если нет, только потом вбивать в базу данные о занятости этих мест
единственная фраза по теме за весь мост.

объясни - почему тяжело?
почему не справишься?
какие проблемы? Ты можешь написать конкретно?
 

BabyKiller

Guest
Ok, ты меня уговорил :)
Пока проблем особых невижу, но боюсь как бы они не появились.
Завтра начну переправлять всё, если проблемы появятся, то буду ждать от тебя помощи.

-~{}~ 08.01.05 05:21:

Переправил. И как обещал, вопрос:
Вот кусочек программы:
PHP:
if(!mysql_query("SELECT * FROM `var_info`.`all_inf` WHERE num_train=$train AND date=$data AND num_vagon=$vagon AND num_place=$place AND num_st=$st[1]"))
	$status='Занято';else$status="<A href=\"real.php?train=$train&data=$data&vagon=$vagon&place=$place&st=$st[1]\">Свободно</A>";
Почему он всегда возвращает ложный результат?? Я здесь пытался сделать так:Если существует запись, то значит место занято, если нет, то свободно. У меня же, если запись даже существует то выводится что это место свободно.
Может у меня запрос неправильно составлен?
 

Фанат

oncle terrible
Команда форума
Запрос тут не при чем.
ты просто невнимательно прчитал в документации - ЧТО возвращает функция mysql_query
 

BabyKiller

Guest
Да ты прав :)
Я вначале сделал проверку по mysql_result, но потом решил упростить, и как видишь - зря. Пршлось возвращаться к mysql_result, и проверять по возвращаемому значению - пусто ли оно.

На самом деле и запрос у меня был неправилен :) забыл при выборке апострофы поставить в поле data, и поэтому он всегда возвращал пустой результат.

Пока вопросов нет :) Если чё, будь на чеку.
И спасибо, что уговорил меня переписать код, он стал намного меньше весить, быстрее грузится и размер быза занимает килобайты вместо сотен мегабайт. Но один минус появился, раньше у меня столбцы можно было сортировать - ASC DESC, а теперь я создаю HTML таблицы с помощью PHP, и поэтому эта возможность исчезла.

Оффтоп:
Кстати, не знаешь сколько должна быть зарплата на работу:
В компании 6 компов, за ними нужно следить, кароче сисадмином пахать, плюс ещё им сайт переделать - на пхп перейти, и они работают с базой данных на SQL. Работа на пол ставки и по вызову. Сколько примерно должны платить??? Если что, город Томск.
 

Фанат

oncle terrible
Команда форума
раньше у меня столбцы можно было сортировать - ASC DESC, а теперь я создаю HTML таблицы с помощью PHP, и поэтому эта возможность исчезла.
не понял, какая связь и почему исчезла?

Вообще, твоя нынешняя структура тоже не нормализована. Но, конечно же, это не та задача, которая решается в двсе строчки на форуме.
 

BabyKiller

Guest
>не понял, какая связь и почему исчезла?
Ну раньше я создавал заране базу называемой var_info (её структуру я описал в одном из моих предыдущих постов). И спомощью ней (средствами SQL) сортироваал таблицы, и была переменная отвечающая за сортировку.
Сейчас же, у меня этих таблиц нету, и вместо этого я создаю HTML таблицы на ходу, по такому же алгоритму как раньше вводил данные в таблицу. Т.е. получается, что я использую БД const_info для формирования HTML таблиц, и только если мне нужно изменить состояние занятости места, я вношу эту запись БД var_info. А сортировать HMTL таблицы очень сложно, хотя если сначала все записи вносить в массив, а потом этот массив сортировать и выводить... - только так.
В базе var_info у меня теперь только одна таблица. Она содержит 6 полей (они как раз все используются в моём операторе if, который написан выше постом). Назначение полей я думаю объяснять не надо, но на всякий случай: запись содержит номер поезда, день, номер вагона, номер места, номер станции и AUTO_INCREMENT - что полностью описывает ситуацию. Хотя можно было обойтись и без автоинкремента, т.к. записи всё равно все будут уникальны, но это так, на всякий случай.
 

Фанат

oncle terrible
Команда форума
ну, как хочешь.
Но я бы на твоем месте использовал ордер бай.
 

BabyKiller

Guest
Зачем и где его использовать?

-~{}~ 08.01.05 20:56:

Ещё одна проблема :) :)
Только здесь я уже совсем ничего понять не могу:
У меня всё оформление и работа с БД разбита на 5 файлов *.php. Ну вот, делал я, делал, и вдруг, смотрю, у меня в FireFox
<OPTION selected value="xxxx">xxx<OPTION> не работает, а именно этот selected. Решил я проверить на IE, и как я думал там она заработала. И решил я в IE всю структуру протестить, и тут неожиданно при запуске скрипта real.php, IE начинает виснуть, в себе отображает ошибки PHP'шые, грузит на 90% проц и за минуту засоряет всю оперативу!!!!!!!!! Я чё то не понял что это?? В Mozilla FireFox всё без проблем.
IE стоит версии 5.00.3502.1000
Винда 2000, и последний пакет Денвер-2

Фанат
Чтоб не парится тебе и мне, я послал бы тебе свой архивчик, посмотрел, бы у тебя такие глюки проявляются или нет.
 

BabyKiller

Guest
Да знаю об этом я.

Проблема в том, что следующая строка не передаёт переменную:
<input type="image" name="train" value="1">
Прбовал методом GET и POST, не помогает. Проблема как раз кроется в type="image".
 
Сверху