Конец света MySql дрявое корыто, помогите исправить
база накрывается
кто подскажет что делать?
в скрипте куча запросов - штук 30
как выявить вшивую овцу запрос?
как оптимизировать?
что подскажете?
вот самые длинные запросы
Код:
"UPDATE `userlist` SET `limit` = (SELECT COUNT(*) FROM `visitors` WHERE `where` = '$traff_where' AND DATE(datetime) = ADDDATE(DATE(NOW()),-1)) WHERE `url` = '$traff_where';"
Код:
"UPDATE `userlist` SET `status` = 'tested', `limit` = '0' WHERE (SELECT COUNT(*) FROM `visitors` WHERE `where` = `userlist`.`url` AND DATE(datetime) = ADDDATE(DATE(NOW()),-1)) < 3 AND `status` = 'works';"
короче по порядку выполняется примерно 30 запросов по выборке-вставке-обновлению
сверху написал самые длинные, могут ли эти дряни тормозить так что сайт становится недоступным на 1 мин???
или тормозит кучища запросов?
по идее там остальные запросы простые и должны работать мгновенно...
еще там не используются индексы так как не знаю куда их присобачить
в таблицу в сутки добавляется примерно 10 000 записей
что делать???? а??????????????
Вот примерные впечатления от вашего поста.
В любой серьезной субд есть средства профилирования. Подозреваю что таковые есть и в MySQL? При помощи них, вылавливаете проблемный запрос. Если сразу непонятно почему он тормозит, то пожалуйте его сюда, с описанием таблиц (структура, индексы, кол-во записей), и описанием что он делает.
С таким описанием как дали вы, все что можно делать - это гадать на кофейной гуще. Может конечно кто-то и угадает, но рассчитывать на это - несерьезный подход. Единственное что бросилось в глаза это фраза "не используются индексы", если их нет вообще, стоит наверное их создать, если не занете что это, зачем это и "куда присобачить" - рекомендую загуглить.
И ознакомьтес с правилами форума пункт 2 о названии тем.
Профилируйте, смотрите в сторону оператора EXPLAIN перед SQL-запросом.
Включите slow_log и редактируйте запросы, стройте индексы, меняйте схему БД.
http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html
Цитата: kiki
все ппц
база накрывается
кто подскажет что делать?
в скрипте куча запросов - штук 30
как выявить вшивую овцу запрос?
как оптимизировать?
что подскажете?
вот самые длинные запросы
короче по порядку выполняется примерно 30 запросов по выборке-вставке-обновлению
сверху написал самые длинные, могут ли эти дряни тормозить так что сайт становится недоступным на 1 мин???
или тормозит кучища запросов?
по идее там остальные запросы простые и должны работать мгновенно...
еще там не используются индексы так как не знаю куда их присобачить
в таблицу в сутки добавляется примерно 10 000 записей
база накрывается
кто подскажет что делать?
в скрипте куча запросов - штук 30
как выявить вшивую овцу запрос?
как оптимизировать?
что подскажете?
вот самые длинные запросы
Код:
"UPDATE `userlist` SET `limit` = (SELECT COUNT(*) FROM `visitors` WHERE `where` = '$traff_where' AND DATE(datetime) = ADDDATE(DATE(NOW()),-1)) WHERE `url` = '$traff_where';"
Код:
"UPDATE `userlist` SET `status` = 'tested', `limit` = '0' WHERE (SELECT COUNT(*) FROM `visitors` WHERE `where` = `userlist`.`url` AND DATE(datetime) = ADDDATE(DATE(NOW()),-1)) < 3 AND `status` = 'works';"
короче по порядку выполняется примерно 30 запросов по выборке-вставке-обновлению
сверху написал самые длинные, могут ли эти дряни тормозить так что сайт становится недоступным на 1 мин???
или тормозит кучища запросов?
по идее там остальные запросы простые и должны работать мгновенно...
еще там не используются индексы так как не знаю куда их присобачить
в таблицу в сутки добавляется примерно 10 000 записей
По коду sql - видно что проектировал бд ты не аккуратно ты сравниваешь
строки в таблице `userlist` со столбцом `url` = '$traff_where';" я как понял он у тебя строковой наверное varchar(255) типа такогого, ты слышил про первичные ключи так вот для этого нужно использовать целочисленные данные а не строки для сравнния сравниваем ключи а выбираем строки плюс добавляем индекс к первичному числовому ключу так как у тебя здесь команды DML - то индексы только уменьшат скорость вставки обновлений, они во основном используются для DQL - выборки и поиска. Вот что за муть здесь:
Код:
(SELECT COUNT(*) FROM `visitors` WHERE `where` = '$traff_where' AND DATE(datetime) = ADDDATE(DATE(NOW()),-1))
Не проще работа с датой возложить на PHP/Perl ну то есть откуда query - ишь свои запросы. SELECT COUNT(*) FROM `visitors` WHERE `where` = '$ вот изъян, так как у тебя используется условие выборки - WHERE
то не думай что будет один запрос он будет каждый раз пробегать по всей таблице - `visitors` сравнивая столбец - `where` он у тебя ещё наверное строковой если числовой вот к этому столбцу этой таблице добавь индекс ALTER TABLE 'visitors' ADD INDEX('where'), вообще читай книг по больше и не читай понтливых книг с супер запросами они как правила всегда тормозят есть поговорка кто не может тот учит, кто может тот работает. EXPLAIN сделай запрос посмотри какие связи используются если в типе - type будет ALL, короче гугли, здесь много не скажешь качай книгу.
Все вменяемые люди пользуются хранимыми процедурами.