[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поиск по mysql
egorchech
Добрый день! Имеется таблица, с содержанием чуть больше одного миллиона строк, все работает!

$query = mysql_query("SELECT * FROM price_1 WHERE nomer LIKE '%$que%' OR kod_index LIKE '%$que%' OR name LIKE '%$que%'") or die(mysql_error());

А если я делаю поиск по двум и более таблиц с таким же содержанием

$query = mysql_query("
SELECT
price_2.nomer LIKE '%
$que%'
, price_2.kod_index LIKE '%
$que%'
, price_2.name LIKE '%
$que%'
, price_1.nomer LIKE '%
$que%'
, price_1.name LIKE '%
$que%'
, price_1.kod_index LIKE '%
$que%'
FROM
price_1, price_2
"
) or die(mysql_error());


То мне выдаёт ошибку

Warning: mysql_query() [function.mysql-query]: Unable to save result set in /mod/search.php on line 31
MySQL client ran out of memory

Что мне делать? Помогите плз!
Спасибо



Спустя 3 минуты, 53 секунды (3.03.2012 - 13:50) Visman написал(а):
Второй запрос у тебя выглядит очень странно wink.gif
Почему условия в SELECT и где WHERE?

Спустя 53 минуты, 39 секунд (3.03.2012 - 14:44) Placido написал(а):
Выборка без части WHERE
SELECT ... FROM 
a, b

равноценна
SELECT ... FROM
a CROSS JOIN b

А этот тип объединения - самый "объемный" - в этом случае каждая строка первой таблицы соединяется с каждой строкой второй таблицы. И если в таблицах по миллиону записей, в результате имеем один ТРИЛЛИОН строк результата. Тут любой сервер надорвется.

И, да, присоединяюсь к Visman - запрос странный.

Спустя 18 минут, 43 секунды (3.03.2012 - 15:03) egorchech написал(а):
Placido, Второй запрос я сделал в dbForge, как он мне написал запрос так я и поставил) Помогите мне, направьте меня в нужное русло)

Спустя 19 минут, 23 секунды (3.03.2012 - 15:22) egorchech написал(а):

SELECT * FROM price_1, price_2 WHERE
price_2.nomer LIKE '%$que%' OR
price_2.kod_index LIKE '%$que%' OR
price_2.name LIKE '%$que%'OR
price_1.nomer LIKE '%$que%' OR
price_1.name LIKE '%$que%' OR
price_1.kod_index LIKE '%$que%'

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

Спустя 3 минуты, 4 секунды (3.03.2012 - 15:25) alexbel2404 написал(а):
Цитата (egorchech @ 3.03.2012 - 16:22)

SELECT * FROM price_1, price_2 WHERE
price_2.nomer LIKE '%$que%' OR
price_2.kod_index LIKE '%$que%' OR
price_2.name LIKE '%$que%'OR
price_1.nomer LIKE '%$que%' OR
price_1.name LIKE '%$que%' OR
price_1.kod_index LIKE '%$que%'

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

в 4-ой строке поставь тут пробел 'OR , не знаю, может это и не критично, но все же. Если так же не работает, какую ошибку выдает?

Спустя 6 минут, 23 секунды (3.03.2012 - 15:32) egorchech написал(а):
Та же ошибка.

Спустя 14 минут, 27 секунд (3.03.2012 - 15:46) Visman написал(а):
Ошибка из-за того, что между таблицами не установлено соответствие.

Спустя 2 минуты, 6 секунд (3.03.2012 - 15:48) Visman написал(а):
Возможно там два SELECT нужно связать через UNION, если нет соответствия между данными из разных таблиц.

Спустя 15 минут, 53 секунды (3.03.2012 - 16:04) egorchech написал(а):
через UNION пишет

Incorrect key file for table '/tmp/#sql_2b93_2.MYI'; try to repair it

Спустя 4 минуты, 28 секунд (3.03.2012 - 16:09) Visman написал(а):
Такое пишут
Цитата
mySQL. Incorrect key file for table '***'
ошибка возникает когда не хватает места на диске.

При больших и сложных запросах mysql создает временные файлы по умолчанию в директории /tmp и удаляет их после завершения.

Если места под временные файлы не хватает, получаем такую ошибку.

Спустя 6 минут, 48 секунд (3.03.2012 - 16:15) Placido написал(а):
Ошибка, потому что памяти не хватает, чтобы вернуть 1 000 000 000 000 строк (столько получится если в таблицах по миллиону записей). Сделайте два запроса через UNION, как предложил Visman. А вообще, не совсем понятно что и в каком виде вы хотите получить. И покажите ваш запрос с UNION.

Спустя 2 минуты, 28 секунд (3.03.2012 - 16:18) egorchech написал(а):

$query = mysql_query("
SELECT * FROM price_1 WHERE nomer LIKE '%
$que%' OR kod_index LIKE '%$que%' OR name LIKE '%$que%'
UNION
SELECT * FROM price_2 WHERE nomer LIKE '%
$que%' OR kod_index LIKE '%$que%' OR name LIKE '%$que%'
"
) or die(mysql_error());

Спустя 25 минут, 8 секунд (3.03.2012 - 16:43) egorchech написал(а):
Цитата (Placido @ 3.03.2012 - 13:15)
Ошибка, потому что памяти не хватает, чтобы вернуть 1 000 000 000 000 строк (столько получится если в таблицах по миллиону записей). Сделайте два запроса через UNION, как предложил Visman. А вообще, не совсем понятно что и в каком виде вы хотите получить. И покажите ваш запрос с UNION.

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

Спустя 31 минута, 45 секунд (3.03.2012 - 17:15) Placido написал(а):
С запросом, вроде, все в порядке.
См. ответ Visman. Видимо, не хватает места на диске.

Спустя 7 минут, 30 секунд (3.03.2012 - 17:22) egorchech написал(а):
То есть это правильный запрос к БД? Так и делают поиск с такими объемами таблиц? Я слышал что надо использовать какие-то индексы, но я ничего не смог найти полезного.

Спустя 28 минут, 12 секунд (3.03.2012 - 17:50) Visman написал(а):
Цитата (egorchech @ 3.03.2012 - 22:22)
Я слышал что надо использовать какие-то индексы, но я ничего не смог найти полезного.

В этом запросе индексы не помогут, т.к. используется LIKE '%***%'.

Руководство, например
http://phpclub.ru/mysql/doc/
http://www.fpublisher.ru/documentation/mysql_doc/

Если есть возможность запустить mysql со своими ключами, то можно использовать этот ключ
Цитата
-t, --tmpdir=path
Путь для временных файлов. Может быть полезен, если принятый по умолчанию каталог /tmp расположен на слишком маленьком диске и не может вместить все временные таблицы.


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

Спустя 3 минуты, 43 секунды (3.03.2012 - 17:54) Placido написал(а):
Индексы влияют только на скорость выборки. Вам нужно смотреть в сторону секционирования (partitioning), еще это называют "партиционированием". См., например, здесь.

Спустя 8 минут, 40 секунд (3.03.2012 - 18:03) Visman написал(а):
Выполнится такой запрос?
	SELECT nomer FROM price_1 WHERE nomer LIKE '%$que%' OR kod_index LIKE '%$que%' OR name LIKE '%$que%'
UNION
SELECT
nomer FROM price_2 WHERE nomer LIKE '%$que%' OR kod_index LIKE '%$que%' OR name LIKE '%$que%'


или такой
	(SELECT nomer FROM price_1 WHERE nomer LIKE '%$que%' OR kod_index LIKE '%$que%' OR name LIKE '%$que%' LIMIT 1)
UNION
(SELECT nomer FROM price_2 WHERE nomer LIKE '%$que%' OR kod_index LIKE '%$que%' OR name LIKE '%$que%' LIMIT 1)


Спустя 16 минут, 3 секунды (3.03.2012 - 18:19) egorchech написал(а):
Как мне выйти с данной ситуации? Если я буду использовать вместо like =, то я смогу искать по двум таблицам?
Для меня like не совсем подходит) Я хотел реализовать поиск с не полным совпадением, например ищут 224.132\21 а в базе есть строка с 22413221, так я не знаю как мне её выбрать и вывести)

Спустя 1 минута, 38 секунд (3.03.2012 - 18:20) egorchech написал(а):
Цитата (Visman @ 3.03.2012 - 15:03)
Выполнится такой запрос?
	SELECT nomer FROM price_1 WHERE nomer LIKE '%$que%' OR kod_index LIKE '%$que%' OR name LIKE '%$que%'
UNION
SELECT
nomer FROM price_2 WHERE nomer LIKE '%$que%' OR kod_index LIKE '%$que%' OR name LIKE '%$que%'


или такой
	(SELECT nomer FROM price_1 WHERE nomer LIKE '%$que%' OR kod_index LIKE '%$que%' OR name LIKE '%$que%' LIMIT 1)
UNION
(SELECT nomer FROM price_2 WHERE nomer LIKE '%$que%' OR kod_index LIKE '%$que%' OR name LIKE '%$que%' LIMIT 1)

При первом та же ошибка, второй не отобразит то что надо.

Спустя 15 минут, 13 секунд (3.03.2012 - 18:36) Visman написал(а):
egorchech, равенство тут не подойдет, остается LIKE.
Можно создать таблицу слов (словарь) в каждой строке которого будет записано слово, указатель на таблицу и указатель на запись в таблице в которой это слово содержится.
Тогда в запросе будет только один LIKE к таблице словаря.

Спустя 54 секунды (3.03.2012 - 18:37) Visman написал(а):
Цитата (egorchech @ 3.03.2012 - 23:20)
При первом та же ошибка, второй не отобразит то что надо.

А так
	(SELECT nomer FROM price_1 WHERE nomer LIKE '%$que%' OR kod_index LIKE '%$que%' OR name LIKE '%$que%')
UNION
(SELECT nomer FROM price_2 WHERE nomer LIKE '%$que%' OR kod_index LIKE '%$que%' OR name LIKE '%$que%')

Спустя 3 минуты, 19 секунд (3.03.2012 - 18:40) egorchech написал(а):
Так уже пробовал) не работает
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.