Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Один запрос из двух таблиц с сортировкой.
 
 автор: Jemis   (22.04.2005 в 01:34)
 
 

Есть две похожие таблицы с тремя колонками одного названия. Нужно одним запросом сформировать результат в виде таблички "имя - текст", отсортированный, например, по времени записи. Вот вероятный код ( поиск по строке $s_text = "%...%"):

"SELECT tbl1.name, tbl2.name,tbl1.msg, tbl2.msg FROM tbl1,tbl2 WHERE (tbl1.msg LIKE '$s_text' OR tbl2.msg LIKE '$s_text')  ORDER BY ...    LIMIT $start, $number ";

Проблема в том, что этот код без ORDER BY иногда работает, иногда глухо вешает базу данных, а после ORDER BY, должна стоять какая-то комбинация из tbl1.time_record и tbl2.time_record, но те, что я пробовал или дают ошибку или вешают базу.

   
 
 автор: cheops   (22.04.2005 в 12:43)   письмо автору
 
   для: Jemis   (22.04.2005 в 01:34)
 

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

   
 
 автор: Jemis   (22.04.2005 в 13:05)
 
   для: cheops   (22.04.2005 в 12:43)
 

Похоже, что база не справляется со совместной обработкой больших таблиц. Отдельные запросы к каждой таблице проходят нормально.
Я сделал 2 тестовые таблицы - одна около 40.000 записей, другая 150.000.
Условие "ORDER BY (tbl1.time_record OR tbl2.time_record )", которое я ставил с самого начала, работает правильно (или GROUP BY), проверил сегодня на маленьких табличках порядка 100 записей.
Система - Win2000 SR4 на рабочем локальном компьтере, MySQL 4.0.22-nt, процессор Атлон 3200.
После запуска скрипта процесс mysqld-nt.exe забирает 99% ресурсов процессора, снять его нельзя, всё жутко тормозит и спасает только ресет.
Странно, но иногда скрипт срабатывает, может какой-то глюк, вот только раньше ничего подобного не замечал, база установлена полгода назад.
Буду дальше проверять.
PS. Получается что-то типа DoS -атаки на базу.

   
 
 автор: cheops   (22.04.2005 в 16:11)   письмо автору
 
   для: Jemis   (22.04.2005 в 13:05)
 

Хм... вообще говоря странно, зайдите в C:/mysql/data и посмотрите каталог используемой базы данных? Сколько он занимает места?
Предположу две причины:
1) Дистрибутивы MySQL в бинарном коде жутко оптимизированы, может даёт знать Атлон вместо Пня? Ведь в вычислениях всегда ориентируются на Intel.
2) У вас выделено мало оперативной памяти для MySQL, возможно её увеличение приведёт к более быстрому выполнению запросов. По умолчанию MySQL выставляется мизер.

   
 
 автор: Jemis   (22.04.2005 в 17:07)
 
   для: cheops   (22.04.2005 в 16:11)
 

Я обнаружил, что неправ с условием "WHERE (tbl1.msg LIKE '$s_text' OR tbl2.msg LIKE '$s_text')" . Что-то данные выдаются не те, что надо - то вообще всё содержимое таблиц при хотя бы одном совпадении в одной записи, то записи, где искомого слова нет. Однако, сортировка по времени "ORDER BY (tbl1.time_record OR tbl2.time_record )" работает. Буду дальше разбираться.
Каталог базы - 40 Мбайт. Все одинарные запросы к одной таблице работают быстро - 40 записей на странице скрипт выводит за 0.03 -0.25 с.

   
 
 автор: Jemis   (24.04.2005 в 12:30)
 
   для: Jemis   (22.04.2005 в 17:07)
 

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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования