Старый 12.08.2010, 19:46   #1
Специалист
 
Аватар для denkart
 
Регистрация: 29.03.2009
Адрес: denkart
Сообщений: 179
Вес репутации: 139
denkart - очень-очень хороший человекdenkart - очень-очень хороший человекdenkart - очень-очень хороший человекdenkart - очень-очень хороший человек
Отправить сообщение для denkart с помощью ICQ
По умолчанию Помогите SQL ругается

Запрос вида :

SELECT count(tab1.w1) as score, tab1.w2,tab2.name,tab2.cena,tab2.edinica,tab2.tali g,tab2.kat FROM tab1,tab2 WHERE tab2.name = tab1.w2 AND tab1.w1 IN(".$query.") GROUP BY tab1.w2 ORDER BY score DESC


Выдает ошибку :
#1104 - The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

Вот скрин запроса EXPLAIN SELECT



Вроде ограничение какое то у хостера.... порылся, пишут про ключевые поля, запутался совсем. Таблицы всего 3 запрашивается и результат не миллионы строк. Короче похоже упустил я что то..
denkart вне форума   Ответить с цитированием
Старый 12.08.2010, 20:10   #2
Починяю примуса
 
Аватар для Atomic
 
Регистрация: 26.09.2008
Сообщений: 1,505
Вес репутации: 234
Atomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущее
По умолчанию

denkart, вот это дело
Цитата:
SQL_BIG_SELECTS=1
нужно в конфе my.cnf mysql сервера поправить.
ну или ограничивать аппетиты в запросах.
__________________
Починяю разнокалиберные примуса здесь.
Atomic вне форума   Ответить с цитированием
Старый 12.08.2010, 20:24   #3
Bannеd
 
Регистрация: 17.09.2008
Сообщений: 6,447
Вес репутации: 317
Последний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущее
По умолчанию

Цитата:
Сообщение от denkart Посмотреть сообщение
tab1,tab2
умножьте число ВСЕХ строк в таблице tab1 на число ВСЕХ строк в таблице tab2 и прочувствуйте.
либо оно должно быть меньше MAX_JOIN_SIZE, либо должен быть флаг SQL_BIG_SELECTS

проблему скорее всего можно решить оптимизировав запрос так
Код:
SELECT count(tab1.w1) as score, tab1.w2,tab2.name,tab2.cena,tab2.edinica,tab2.tali g,tab2.kat FROM tab1 JOIN tab2 ON tab2.name = tab1.w2 WHERE  tab1.w1 IN(".$query.") GROUP BY tab1.w2 ORDER BY score DESC
tab2.name и tab1.w2 должны иметь индексы

Добавлено через 2 минуты
Цитата:
Сообщение от denkart Посмотреть сообщение
результат не миллионы строк
запятая (,) в объединении таблиц в запросе это полный перебор КАЖДОЙ строки из первой таблицы с КАЖДОЙ строкой второй таблицы, а уже потом проверка условий WHERE. перемножьте количество строк и станет ясно.

Добавлено через 1 минуту
Цитата:
Сообщение от denkart Посмотреть сообщение
Вот скрин запроса EXPLAIN SELECT
где скрин? не вижу.

Последний раз редактировалось Последний Герой; 12.08.2010 в 20:24. Причина: Добавлено сообщение
Последний Герой вне форума   Ответить с цитированием
Старый 12.08.2010, 20:35   #4
Новичок
 
Регистрация: 17.08.2009
Сообщений: 53
Вес репутации: 129
Vodolei на пути к лучшему
По умолчанию

В group by нужно включить все выводимые поля tab1.w2,tab2.name,tab2.cena,tab2.edinica,tab2.tali g,tab2.kat
Vodolei вне форума   Ответить с цитированием
Старый 12.08.2010, 20:38   #5
Bannеd
 
Регистрация: 17.09.2008
Сообщений: 6,447
Вес репутации: 317
Последний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущееПоследний Герой - прекрасное будущее
По умолчанию

Цитата:
Сообщение от Vodolei Посмотреть сообщение
В group by нужно включить все выводимые поля tab1.w2,tab2.name,tab2.cena,tab2.edinica,tab2.tali g,tab2.kat
тогда результат будет другой.
Последний Герой вне форума   Ответить с цитированием
Старый 13.08.2010, 10:46   #6
Специалист
 
Аватар для denkart
 
Регистрация: 29.03.2009
Адрес: denkart
Сообщений: 179
Вес репутации: 139
denkart - очень-очень хороший человекdenkart - очень-очень хороший человекdenkart - очень-очень хороший человекdenkart - очень-очень хороший человек
Отправить сообщение для denkart с помощью ICQ
По умолчанию

Цитата:
Сообщение от Atomic Посмотреть сообщение
denkart, вот это дело

нужно в конфе my.cnf mysql сервера поправить.
ну или ограничивать аппетиты в запросах.
Конфиг поправить не могу, хостинг не мой.. аппетиты совсем не большие, обычный запрос, написал вот только скорее всего неправильно.. оптимизация нужна :-)
denkart вне форума   Ответить с цитированием
Старый 13.08.2010, 11:49   #7
Специалист
 
Аватар для denkart
 
Регистрация: 29.03.2009
Адрес: denkart
Сообщений: 179
Вес репутации: 139
denkart - очень-очень хороший человекdenkart - очень-очень хороший человекdenkart - очень-очень хороший человекdenkart - очень-очень хороший человек
Отправить сообщение для denkart с помощью ICQ
По умолчанию

Цитата:
Сообщение от Последний Герой Посмотреть сообщение
умножьте число ВСЕХ строк в таблице tab1 на число ВСЕХ строк в таблице tab2 и прочувствуйте.
либо оно должно быть меньше MAX_JOIN_SIZE, либо должен быть флаг SQL_BIG_SELECTS

проблему скорее всего можно решить оптимизировав запрос так
Код:
SELECT count(tab1.w1) as score, tab1.w2,tab2.name,tab2.cena,tab2.edinica,tab2.tali g,tab2.kat FROM tab1 JOIN tab2 ON tab2.name = tab1.w2 WHERE  tab1.w1 IN(".$query.") GROUP BY tab1.w2 ORDER BY score DESC
tab2.name и tab1.w2 должны иметь индексы
Добавлено через 2 минуты

запятая (,) в объединении таблиц в запросе это полный перебор КАЖДОЙ строки из первой таблицы с КАЖДОЙ строкой второй таблицы, а уже потом проверка условий WHERE. перемножьте количество строк и станет ясно.

Добавлено через 1 минуту

где скрин? не вижу.
Вот скрин :sql_.jpg
Эти флаги, насколько я понимаю регулирует хостер изменить я их не смогу. Сейчас получается 215 475 и срабатывает ограничение хостера.

Предположительно таблицы будут заполнены 100 000 строк и 3000 строк т.е. выходит 300 000 000. Что же делать ? Это вообще нормально или я горячусь ?

Насчет индексов не понял. Нужно запросить из tab2.name и tab1.w2 поля tab2.id и tab1.id или как то создать их в запросе ?

А как можно сделать по другому ? Вначале проверять условия по определенным столбцам таблицы а потом, при выполнении условий, перебирать строку ?
denkart вне форума   Ответить с цитированием
Старый 13.08.2010, 18:02   #8
Специалист
 
Аватар для denkart
 
Регистрация: 29.03.2009
Адрес: denkart
Сообщений: 179
Вес репутации: 139
denkart - очень-очень хороший человекdenkart - очень-очень хороший человекdenkart - очень-очень хороший человекdenkart - очень-очень хороший человек
Отправить сообщение для denkart с помощью ICQ
По умолчанию

Всем спасибо за участие JOIN решает :-)

Добавлено через 3 часа 42 минуты
Замена запятой на INNER JOIN и WHERE на ON проблемы не решило....
Все работает если делаю меньше запрашиваемых полей tab1.w2,tab2.name,tab2.cena,tab2.edinica,tab2.tali g,tab2.kat

Но они мне нужны !

Сделал вот так :
mysql_query("SET SQL_BIG_SELECTS=1");
Потом так:
mysql_query("SELECT count(tab1.w1) as score, tab1.w2,tab2.name,tab2.cena,tab2.edinica,tab2.tali g,tab2.kat FROM tab1INNER JOIN tab2 ON tab2.name = tab1.w2 AND tab1.w1 IN(".$query.") GROUP BY tab1.w2 ORDER BY score DES")

Проблема решилась..... но правильно это, или нет ? Сервер то не мой и хостер наверное заметит нагрузку, если например такие запросы будит идти ежеминутно, или чаще при том, предположительно таблицы будут заполнены 100 000 строк и 3000 строк т.е. меня интересует насколько это нормально ? Хостеры такое переваривают нормально или это кривое решение и подобное делается как то принципиально по другому?

Последний раз редактировалось denkart; 13.08.2010 в 18:02. Причина: Добавлено сообщение
denkart вне форума   Ответить с цитированием
Старый 13.08.2010, 18:11   #9
Починяю примуса
 
Аватар для Atomic
 
Регистрация: 26.09.2008
Сообщений: 1,505
Вес репутации: 234
Atomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущееAtomic - прекрасное будущее
По умолчанию

denkart, ну тут как сказать, у меня еще более тяжелые запросы крутятся по 500 тыс записей в таблице на виртуале и ничего..
__________________
Починяю разнокалиберные примуса здесь.
Atomic вне форума   Ответить с цитированием
Старый 13.08.2010, 18:18   #10
Специалист
 
Аватар для denkart
 
Регистрация: 29.03.2009
Адрес: denkart
Сообщений: 179
Вес репутации: 139
denkart - очень-очень хороший человекdenkart - очень-очень хороший человекdenkart - очень-очень хороший человекdenkart - очень-очень хороший человек
Отправить сообщение для denkart с помощью ICQ
По умолчанию

Оставляю так..... а то уже 3 день мучаюсь SQL пока не очень знаю, вот и переживаю насчет корректности, переделывать просто потом прилично придется.
denkart вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
HELP Народ помошник интернет безопасности ругается. ahtoiiika Яндекс 3 18.06.2010 00:30
Это так поддержка ругается на тупые вопросы, или я туплю? treningdom Вопросы от новичков 6 04.06.2010 08:09
Антивирусник ругается на форум Сапе Lesnik59 Вопросы о работе форума 32 15.01.2010 20:37
Google ругается на сайт RusVolkof Google, MSN, Yahoo 11 05.01.2010 09:40
Яндекс ругается-YAP нельзя нажимать? nik-b Яндекс 12 22.08.2008 14:55


Часовой пояс GMT +3, время: 10:52.