12.08.2010, 19:46 | #1 |
Специалист
|
Помогите 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 запрашивается и результат не миллионы строк. Короче похоже упустил я что то.. |
12.08.2010, 20:24 | #3 |
Bannеd
Регистрация: 17.09.2008
Сообщений: 6,446
Вес репутации: 369
|
умножьте число ВСЕХ строк в таблице 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 Добавлено через 2 минуты запятая (,) в объединении таблиц в запросе это полный перебор КАЖДОЙ строки из первой таблицы с КАЖДОЙ строкой второй таблицы, а уже потом проверка условий WHERE. перемножьте количество строк и станет ясно. Добавлено через 1 минуту где скрин? не вижу. Последний раз редактировалось Последний Герой; 12.08.2010 в 20:24. Причина: Добавлено сообщение |
12.08.2010, 20:38 | #5 |
Bannеd
Регистрация: 17.09.2008
Сообщений: 6,446
Вес репутации: 369
|
|
13.08.2010, 10:46 | #6 |
Специалист
|
|
13.08.2010, 11:49 | #7 | |
Специалист
|
Цитата:
Эти флаги, насколько я понимаю регулирует хостер изменить я их не смогу. Сейчас получается 215 475 и срабатывает ограничение хостера. Предположительно таблицы будут заполнены 100 000 строк и 3000 строк т.е. выходит 300 000 000. Что же делать ? Это вообще нормально или я горячусь ? Насчет индексов не понял. Нужно запросить из tab2.name и tab1.w2 поля tab2.id и tab1.id или как то создать их в запросе ? А как можно сделать по другому ? Вначале проверять условия по определенным столбцам таблицы а потом, при выполнении условий, перебирать строку ? |
|
13.08.2010, 18:02 | #8 |
Специалист
|
Всем спасибо за участие 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. Причина: Добавлено сообщение |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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, время: 03:57.