| |
автор: 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, но те, что я пробовал или дают ошибку или вешают базу. | |
| |
|
|
| |
|
|
| |
для: 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 -атаки на базу. | |
| |
|
|
| |
|
|
| |
для: 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)
| | | В общем, действительно, мой запрос составлен неправильно, так требуемые данные из двух таблиц не извлечь, нужно обращаться к каждой таблице в отдельности. А мой запрос приводил к совершенно неожиданным результатам, когда одна и та же запись выводилась многократно, для больших таблиц это, наверное, и вызывало зависание базы.
Скверно то, что таким способом один пользователь может подвесить сервер баз данных, например, на каком-нибуть хостинге. | |
| |
|
|