Вы не авторизованы.
У Руцентра уже несколько дней сетевые атаки.
Позвонил, сказали что атаки возможно ведутся из международных сетей и скоро устронят. А через час пришло письмо об отключении доступа к БД. "Работа услуги хостинга создает аномально высокую нагрузку на сервер баз данных MySQL хостинга. Во избежание усугубления негативных последствий для системы оказания услуг хостинга, мы были вынуждены произвести блокировку MySQL-сервера.
Рекомендуем оптимизировать работу скриптов Вашего сайта.
Оптимизация запросов к базе данных должна сводиться к следующим результатам:
- во всех запросах используются для выборки данных индексы,
- минимизировано использование временных файлов и операций filesort.
Все эти данные для каждого из запросов можно получить с помощью EXPLAIN:"
Примеры запросов:
Примеры запросов:
453999070 baza_mysql 212.193.247.34:26533 baza_db1 Query 2 Locked SELECT * FROM SC_products WHERE slug='ruchka-sharikovaja-the-retro-ds1-tpp-zheltaja-s-chernym'
\n WHERE t1.enabled=1 AND t1.categoryID != 1 ORDER BY t1.date_added DESC LIMIT 0,250esult SELECT t1.*, t3.thumbnail FROM SC_products t1
454001798 baza_mysql 212.193.247.34:29078 baza_db1 Query 6 Locked update SC_products set viewed_times=viewed_times+1 where productID=45116
454003045 baza_mysql 212.193.247.34:30287 baza_db1 Query 2 Locked SELECT * FROM SC_products WHERE slug='brelok-ruletka-chajnik-1m_y4'
454003046 baza_mysql 212.193.247.34:30288 baza_db1 Query 1 Locked SELECT * FROM SC_products WHERE slug='nastolnyj-pribor_xc'
\n WHERE t1.enabled=1 AND t1.categoryID != 1 ORDER BY t1.date_added DESC LIMIT 0,250esult SELECT t1.*, t3.thumbnail FROM SC_products t1
454003050 baza_mysql 212.193.247.34:30292 baza_db1 Query 2 Locked SELECT * FROM SC_products WHERE slug='sumka-dlja-konferencij_5b'
454003695 baza_mysql 212.193.247.34:30837 baza_db1 Query 2 Locked SELECT * FROM SC_products WHERE slug='ruchka-roller-cross-model-century-ii-v-futljare-serebristaja-s-zolotom'
\n WHERE t1.enabled=1 AND t1.categoryID != 1 ORDER BY t1.date_added DESC LIMIT 0,250esult SELECT t1.*, t3.thumbnail FROM SC_products t1
\n WHERE t1.enabled=1 AND t1.categoryID != 1 ORDER BY t1.date_added DESC LIMIT 0,250esult SELECT t1.*, t3.thumbnail FROM SC_products t1
\n WHERE t1.enabled=1 AND t1.categoryID != 1 ORDER BY t1.date_added DESC LIMIT 0,250esult SELECT t1.*, t3.thumbnail FROM SC_products t1
454004988 baza_mysql 212.193.247.34:32042 baza_db1 Query 1 Locked SELECT COUNT(DISTINCT p.productID) as cnt FROM SC_products p WHERE (categoryID IN (1305)) AND ( enabled=1)
\n WHERE t1.enabled=1 AND t1.categoryID != 1 ORDER BY t1.date_added DESC LIMIT 0,250esult SELECT t1.*, t3.thumbnail FROM SC_products t1
454004990 baza_mysql 212.193.247.34:32044 baza_db1 Query 2 Locked SELECT * FROM SC_products WHERE slug='zaponki-pobeda'
\n WHERE t1.enabled=1 AND t1.categoryID != 1 ORDER BY t1.date_added DESC LIMIT 0,250esult SELECT t1.*, t3.thumbnail FROM SC_products t1
454006311 baza_mysql 212.193.247.34:33196 baza_db1 Query 2 Locked SELECT * FROM SC_products WHERE slug='volchok-elochka'
454007800 baza_mysql 212.193.247.34:34541 baza_db1 Query 6 Locked SELECT * FROM SC_products WHERE productID=74586
--
Помогите, как можно оптимизировать работу БД? Я особо не понимаю что в этих запросах показано... А сайт не работает.
Отредактировано sirhc (2013-08-02 13:17)
Неактивен
Попался толковый специалист техподдержки и сказал, что запрос к БД написан криво. В частности, в месте
SELECT * FROM SC_products WHERE
Звёздочка означает, что происходит поиск по всем таблицам в базе. Также спец порекомендовал заменить эту звёздочку на конкретное значение, тогда всё будет ок.
Подскажите, кто знает, как это поправить?
Неактивен
Да, хороший вопрос)
Я так же слышал подобное от поддержки ник ру. Но меня это не убедило, хотя оптимизация не помешала бы точно.
ида, здесь приводится пример с EXPLAIN, а как им пользоваться? я не совсем гений в этом вопросе)))))
Неактивен
sirhc написал:
Попался толковый специалист техподдержки и сказал, что запрос к БД написан криво. В частности, в месте
Код:
SELECT * FROM SC_products WHEREЗвёздочка означает, что происходит поиск по всем таблицам в базе. Также спец порекомендовал заменить эту звёздочку на конкретное значение, тогда всё будет ок.
Подскажите, кто знает, как это поправить?
Звездочка означает поиск не по всем таблицам, а по всем полям таблицы SC_products. Чтобы заменить звездочку на нужные поля, вы должны знать какие поля собираетесь использовать. Только не уверен что это сильно снизит нагрузку. Обычно конструкции типа LEFT JOIN нагружают (если составлены не верно).
Неактивен
в ник ру сейчас все нагружает. мне примерно тоже самое говорят.
так все же вопрос ТС актуален, как оптимизировать эту самую базу?
В частности, касаемо "не используются для выборки данных индексы"
Здесь в основном пользователи несколько далекие от профессиональной работы с базой данных. А как получить ответы, если на них никто не отвечает?
Ида, подобные проблемы существуют не только с ник.ру, а как дела будут обстоять с 5 версией движка, там тоже косяк на косяке будет? У кого как, люди расскажите!
Отредактировано komkom (2013-08-02 14:13)
Неактивен
komkom написал:
Да, хороший вопрос)
Я так же слышал подобное от поддержки ник ру. Но меня это не убедило, хотя оптимизация не помешала бы точно.
ида, здесь приводится пример с EXPLAIN, а как им пользоваться? я не совсем гений в этом вопросе)))))
Я тоже не спец, но исходя из слов оператора, то что эта звёздочка делает запрос по всем полям вместо конкретного - это действительно минус.
Вопрос в том, что сайт отключен, а акцент, как я понял они делают на оптимизацию данных запросов. Поэтому:
1. Может кто знает, как эту звёздочку заменить на что-нить более красивое? Чтобы запрос был более узконаправленным?
2. Также я заметил двух наглых ботов в логах. Это "AhrefsBot" и "BLEXBot". Это какие-то SEO сервисы. Прыгают по страницам через каждую секунду. Я их запретил в robots.txt:
User-agent: AhrefsBot Disallow: / User-agent: BLEXBot Disallow: /
Только не знаю, будут они слушаться или нет... Как ещё можно запретить подобных нарушителей?
Неактивен
sirhc написал:
User-agent: AhrefsBot
Disallow: /
Это вот эти недостойные люди https://ahrefs.com/ точнее те кто ими пользуется)
банить их я так понимаю нужно через запрет по ip, но у меня чето не получается.
пс, вчара тоже увидел их в логах, на это время сайт лег.
как защититься?
Неактивен
komkom написал:
sirhc написал:
User-agent: AhrefsBot
Disallow: /Это вот эти недостойные люди https://ahrefs.com/ точнее те кто ими пользуется)
банить их я так понимаю нужно через запрет по ip, но у меня чето не получается.
пс, вчара тоже увидел их в логах, на это время сайт лег.
как защититься?
А как по IP блокируете? Вот на одном сайте нашёл такую рекомендацию, в файле index.php прописать:
if($_SERVER['REMOTE_ADDR'] == '213.186.119.132') die;
Неактивен
Вообще в логах прописан адрес страницы робота и у AhrefsBot (http://ahrefs.com/robot/) и у BLEXBot (http://webmeup.com/crawler.html)
Там указано как запретить им доступ, впринципе как я выше и описан. Вопрос в том, насколько они добросовестны...
Неактивен
.htaccess
Deni from
http://www.htaccess.net.ru/doc/htaccess/order.php
Неактивен
А что со звёздочкой? Есть идеи или комментарии как оптимизировать данный запрос (пример в первом посте)?
Неактивен
sirhc написал:
А что со звёздочкой? Есть идеи или комментарии как оптимизировать данный запрос (пример в первом посте)?
в данном конкретном случае
function GetProduct( $productID){
$productID = (int)$productID;
$q = db_query('SELECT * FROM '.PRODUCTS_TABLE.' WHERE productID='.$productID);
замените на $q = db_query('SELECT productID, categoryID, Price, ..... FROM '.PRODUCTS_TABLE.' WHERE productID='.$productID);
Неактивен
это в каком файле, туплю чего то
Отредактировано komkom (2013-08-02 15:09)
Неактивен
Это в \published\sc\html\scripts\core_functions\product_functions.php,
а в этой функции тоже наверное надо?
function loadBySlug($slug){ if($this->getRegisteredByID($slug)) return; $product = db_phquery_fetch(DBRFETCH_ASSOC, 'SELECT * FROM ?#PRODUCTS_TABLE WHERE slug=?', $slug); LanguagesManager::ml_fillFields($this->__db_table, $product); $this->loadFromArray($product); $this->registerByID($product['productID']); $this->registerByID($product['slug']); }
это из файла \published\sc\html\scripts\classes\class.product.php.
Ведь в файле product_functions.php в конце запроса идёт WHERE productID, а мне на хостинге преъявили примеры с окончанием WHERE slug, а такую функцию я нашёл как раз в \published\sc\html\scripts\classes\class.product.php.
И ещё вопрос - звёздочку меняем на "productID, categoryID, Price, ....." прямо так? С троеточием? Или взаместо него что-то поставить нужно? (Простите за неграмотность
Отредактировано sirhc (2013-08-02 15:29)
Неактивен
нужно перечислить все данные которые хотите выбрать из таблицы..... смотрите у себя в базе через PHPMyAdmin
Неактивен
Насчет function loadBySlug. Не помню уже за что она отвечает. GetProduct непосредственно запрашивает продукт в карточке (например).
И ещё вопрос - звёздочку меняем на "productID, categoryID, Price, ....." прямо так? С троеточием? Или взаместо него что-то поставить нужно? (Простите за неграмотность smile
Нет. троеточие меняете на те поля, которые хотите запрашивать через запятую.
Отредактировано jekky25 (2013-08-02 15:46)
Неактивен
komkom написал:
нужно перечислить все данные которые хотите выбрать из таблицы..... смотрите у себя в базе через PHPMyAdmin
Так, а если какой-то параметр не будет указан? Например в таблице есть колонка 'sort_order'. Можете раъяснить мне невеже , что будет если не указать этот параметр?
Неактивен
Возможно, в БД для таблицы SC_products нет индекса по полю slug, его можно добавить следующим запросом:
ALTER IGNORE TABLE `SC_products` ADD INDEX `slug`( `slug` );
ALTER TABLE `SC_products` ADD INDEX `category-enabled` ( `enabled` ,`categoryID`) ; ALTER TABLE `SC_products` ADD INDEX `category-enabled-date` ( `enabled` ,`categoryID`,`date_added `) ;
И, возможно, удалить индекс по enabled
Так же имеет смысл проверить и запустить оптимизацию для таблиц установки (средствами phpMyAdmin это достаточно легко делается).
SELECT * FROM %TABLENAME% WHERE %CONDITIONS%
Звездочка - это не поиск по всем таблицам в базе и не поиск по всем полям в таблице.
Это список полей, которые будут возвращены в результате чтения записей из БД, которые удовлетворяют условиям %CONDITIONS%
Замена * на конкретные значения не даст ничего, поскольку используются практически все поля (за редким исключением) и разница в скорости будет в лучшем случае пара милисекунд (что в процентном отношении явно меньше 1%), а скорее всего ничего и не даст.
А проблема с нагрузкой от поисковиков - типовая (на уровне robots.txt) - для всех них нужно как минимум указывать задержку (Crawl-Delay) с учетом общего числа страниц сайта и желаемым временем переиндексирования (и нужности индексирования именно этим поисковиком), опционально помогает запрет индексации служебных страниц.
В самых тяжелых случаях блокировать наглых ботов по IP (на уровне .htaccess).
Неактивен
Vladislav, а Вы уверены, что указание конкретных полей ничего не даст? Я насчитал довольно много ненужного: customers_rating, customer_votes, items_sold, enabled, list_price, viewed_times, add2cart_counter, eproduct_filename, eproduct_available_days, eproduct_download_times, shipping_freight, classID, name_en, brief_description_en, description_en, meta_title_en, meta_description_en, meta_keywords_en, ordering_available.
И ещё, если не сложно, можете написать, что даст добавление индекса в таблицу SC_products по полю slug?
Неактивен
sirhc написал:
komkom написал:
нужно перечислить все данные которые хотите выбрать из таблицы..... смотрите у себя в базе через PHPMyAdmin
Так, а если какой-то параметр не будет указан? Например в таблице есть колонка 'sort_order'. Можете раъяснить мне невеже
, что будет если не указать этот параметр?
Все указанные поля скидываются в массив. Если поле не указано, его в массиве не будет. Если по нему какую-то выборку делаете, то она правильно работать не будет. Например поле description не указали, соответственно описание продукта не будет выводиться.
Неактивен
Ясно.
В посте #19 я перечислил те поля, которые считаю ненужными, есть вероятность, что движок заработает быстрее, если их не учесть?
И ещё, что значит t1.* в запросе к базе:
\n WHERE t1.enabled=1 AND t1.categoryID != 1 ORDER BY t1.date_added DESC LIMIT 0,250esult SELECT t1.*, t3.thumbnail FROM SC_products t1
?
Отредактировано sirhc (2013-08-02 17:52)
Неактивен
добавление индекса по полю ускоряет выборку по этому полю (в несколько раз т.е. если запрос был 4 секунды, а станет 1)
перечисление только части полей позволит сэкономить лишь на времени передаче данных от SQL сервера к PHP скрипту (даже для случая, когда это разные физические сервера при выборе 10-100 записей разница не значительная — те самые пара миллисекунд если сервер находится далеко, а вероятность ошибочно пропустить нужные данные все же выше), при желании можете поэкспериментировать на БД под нагрузкой, выбирая 100 записей со * и одним только полем - phpMyAdmin умеет показывать время выполнения запроса.
P.S. а логи с запросами у вас не полные - там явно видны хвосты. либо вы некорректно их скопировали, либо хостер от вас отмахнулся не потрудившись полностью скопировать
Отредактировано Vladislav (2013-08-02 18:29)
Неактивен
sirhc написал:
Ясно.
И ещё, что значит t1.* в запросе к базе:
полный запрос к бд пишется как
SELECT t.имяПоля FROM имяТаблицы as t WHERE t.имяПоля = условие
При выборке из одной таблицы префикс t (кстати необязательно t можно как угодно назвать) опускается. Если выборка идет сразу из нескольких таблиц, то префиксы ставят (хотя и не везде). Это позволяет избежать путаницы при запросе и заброс будет корректно обработан.
Неактивен
Очень полезная получилась ветка, спасибо всем кто здесь отписался)
Неактивен
В итоге сайт включили только после того, как я оптимизировал запросы к базе, хотя надо сказать, что сайт стал работать гораздо быстрее. Сделано было следующее:
1. Сделал замену mysql_pconnect на mysql_connect, как написано тут: http://forum.webasyst.ru/viewtopic.php?id=5376
2. Отключил счётчик со статистикой просмотров карточки товара.
3. Уточнил запросы к базе. Конкретно к таблице SC_products. Всё-таки думаю что это сделать необходимо было, т.к. кол-во читаемых полей сократилось раза в три.
4. Закрыл индексацию сайта для SEO-ботов.
Вот кстати по поводу этих самых ботов, так называемый AhrefsBot не читает robots.txt, хотя в логах прописан адрес страницы по управлению этим ботом и есть информация о том, как запретить индексацию.
Почему я поднимаю вопрос конкретно по этому боту - он оставил заметный след в логах. Например, за вчерашний день в логах записей бота Яндекса - 2500 шт., Гугла - 750 шт., а AhrefsBot'а - 6500 шт. Эта тварь можешь сразу положить сервер, как два пальца.
Что касается блокировки по IP, то у него айпишники все разные:
5.10.83.55
5.10.83.82
5.10.83.21
5.10.83.27
5.10.83.100
5.10.83.19
Как же с этим бороться?
Неактивен