• Главная
  •  » Хостинг
  •  » Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

#1 2013-08-02 12:30

sirhc
Пользователь

Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

У Руцентра уже несколько дней сетевые атаки.

Позвонил, сказали что атаки возможно ведутся из международных сетей и скоро устронят. А через час пришло письмо об отключении доступа к БД. "Работа услуги хостинга создает аномально высокую нагрузку на сервер баз данных 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)

Неактивен

 

#2 2013-08-02 13:19

sirhc
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

Попался толковый специалист техподдержки и сказал, что запрос к БД написан криво. В частности, в месте

Код:

SELECT * FROM SC_products WHERE

Звёздочка означает, что происходит поиск по всем таблицам в базе. Также спец порекомендовал заменить эту звёздочку на конкретное значение, тогда всё будет ок.

Подскажите, кто знает, как это поправить?

Неактивен

 

#3 2013-08-02 13:37

komkom
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

Да, хороший вопрос)

Я так же слышал подобное от поддержки ник ру. Но меня это не убедило, хотя оптимизация не помешала бы точно.

ида, здесь приводится пример с EXPLAIN, а как им пользоваться? я не совсем гений в этом вопросе)))))

Неактивен

 

#4 2013-08-02 14:04

jekky25
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

sirhc написал:

Попался толковый специалист техподдержки и сказал, что запрос к БД написан криво. В частности, в месте

Код:

SELECT * FROM SC_products WHERE

Звёздочка означает, что происходит поиск по всем таблицам в базе. Также спец порекомендовал заменить эту звёздочку на конкретное значение, тогда всё будет ок.

Подскажите, кто знает, как это поправить?

Звездочка означает поиск не по всем таблицам, а по всем полям таблицы SC_products. Чтобы заменить звездочку на нужные поля, вы должны знать какие поля собираетесь использовать. Только не уверен что это сильно снизит нагрузку. Обычно конструкции типа LEFT JOIN нагружают (если составлены не верно).

Неактивен

 

#5 2013-08-02 14:10

komkom
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

в ник ру сейчас все нагружает. мне примерно тоже самое говорят.

так все же вопрос ТС актуален, как оптимизировать эту самую базу?
В частности, касаемо "не используются для выборки данных индексы"

Здесь в основном пользователи несколько далекие от профессиональной работы с базой данных. А как получить ответы, если на них никто не отвечает?


Ида, подобные проблемы существуют не только с ник.ру, а как дела будут обстоять с 5 версией движка, там тоже косяк на косяке будет? У кого как, люди расскажите!

Отредактировано komkom (2013-08-02 14:13)

Неактивен

 

#6 2013-08-02 14:12

sirhc
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

komkom написал:

Да, хороший вопрос)

Я так же слышал подобное от поддержки ник ру. Но меня это не убедило, хотя оптимизация не помешала бы точно.

ида, здесь приводится пример с EXPLAIN, а как им пользоваться? я не совсем гений в этом вопросе)))))

Я тоже не спец, но исходя из слов оператора, то что эта звёздочка делает запрос по всем полям вместо конкретного - это действительно минус.

Вопрос в том, что сайт отключен, а акцент, как я понял они делают на оптимизацию данных запросов. Поэтому:

1. Может кто знает, как эту звёздочку заменить на что-нить более красивое? Чтобы запрос был более узконаправленным?

2. Также я заметил двух наглых ботов в логах. Это "AhrefsBot" и "BLEXBot". Это какие-то SEO сервисы. Прыгают по страницам через каждую секунду. Я их запретил в robots.txt:

Код:

User-agent: AhrefsBot
Disallow: /

User-agent: BLEXBot
Disallow: /

Только не знаю, будут они слушаться или нет... Как ещё можно запретить подобных нарушителей?

Неактивен

 

#7 2013-08-02 14:18

komkom
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

sirhc написал:

User-agent: AhrefsBot
Disallow: /

Это вот эти недостойные люди https://ahrefs.com/ точнее те кто ими пользуется)

банить их я так понимаю нужно через запрет по ip, но у меня чето не получается.

пс, вчара тоже увидел их в логах, на это время сайт лег.

как защититься?

Неактивен

 

#8 2013-08-02 14:27

sirhc
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

komkom написал:

sirhc написал:

User-agent: AhrefsBot
Disallow: /

Это вот эти недостойные люди https://ahrefs.com/ точнее те кто ими пользуется)

банить их я так понимаю нужно через запрет по ip, но у меня чето не получается.

пс, вчара тоже увидел их в логах, на это время сайт лег.

как защититься?

А как по IP блокируете? Вот на одном сайте нашёл такую рекомендацию, в файле index.php прописать:

Код:

if($_SERVER['REMOTE_ADDR'] == '213.186.119.132') die;

Неактивен

 

#9 2013-08-02 14:41

sirhc
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

Вообще в логах прописан адрес страницы робота и у AhrefsBot (http://ahrefs.com/robot/) и у BLEXBot (http://webmeup.com/crawler.html)

Там указано как запретить им доступ, впринципе как я выше и описан. Вопрос в том, насколько они добросовестны...

Неактивен

 

#10 2013-08-02 14:41

Bahtim
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

Неактивен

 

#11 2013-08-02 14:50

sirhc
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

А что со звёздочкой? Есть идеи или комментарии как оптимизировать данный запрос (пример в первом посте)?

Неактивен

 

#12 2013-08-02 15:01

jekky25
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

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);

Неактивен

 

#13 2013-08-02 15:09

komkom
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

это в каком файле, туплю чего то

Отредактировано komkom (2013-08-02 15:09)

Неактивен

 

#14 2013-08-02 15:21

sirhc
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

Это в \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, ....." прямо так? С троеточием? Или взаместо него что-то поставить нужно? (Простите за неграмотность smile

Отредактировано sirhc (2013-08-02 15:29)

Неактивен

 

#15 2013-08-02 15:38

komkom
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

нужно перечислить все данные которые хотите выбрать из таблицы..... смотрите у себя в базе через PHPMyAdmin

Неактивен

 

#16 2013-08-02 15:44

jekky25
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

Насчет function loadBySlug. Не помню уже за что она отвечает. GetProduct непосредственно запрашивает продукт в карточке (например).

И ещё вопрос - звёздочку меняем на "productID, categoryID, Price, ....." прямо так? С троеточием? Или взаместо него что-то поставить нужно? (Простите за неграмотность smile

Нет. троеточие меняете на те поля, которые хотите запрашивать через запятую.

Отредактировано jekky25 (2013-08-02 15:46)

Неактивен

 

#17 2013-08-02 15:53

sirhc
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

komkom написал:

нужно перечислить все данные которые хотите выбрать из таблицы..... смотрите у себя в базе через PHPMyAdmin

Так, а если какой-то параметр не будет указан? Например в таблице есть колонка 'sort_order'. Можете раъяснить мне невеже smile, что будет если не указать этот параметр?

Неактивен

 

#18 2013-08-02 15:55

Vladislav
Webasyst

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

Возможно, в БД для таблицы 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).

Неактивен

 

#19 2013-08-02 16:08

sirhc
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

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?

Неактивен

 

#20 2013-08-02 16:26

jekky25
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

sirhc написал:

komkom написал:

нужно перечислить все данные которые хотите выбрать из таблицы..... смотрите у себя в базе через PHPMyAdmin

Так, а если какой-то параметр не будет указан? Например в таблице есть колонка 'sort_order'. Можете раъяснить мне невеже smile, что будет если не указать этот параметр?

Все указанные поля скидываются в массив. Если поле не указано, его в массиве не будет. Если по нему какую-то выборку делаете, то она правильно работать не будет. Например поле description не указали, соответственно описание продукта не будет выводиться.

Неактивен

 

#21 2013-08-02 16:50

sirhc
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

Ясно.

В посте #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)

Неактивен

 

#22 2013-08-02 18:27

Vladislav
Webasyst

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

добавление индекса по полю ускоряет выборку по этому полю (в несколько раз т.е. если запрос был 4 секунды, а станет 1)
перечисление только части полей позволит сэкономить лишь на времени передаче данных от SQL сервера к PHP скрипту (даже для случая, когда это разные физические сервера при выборе 10-100 записей разница не значительная  — те самые пара миллисекунд если сервер находится далеко, а вероятность ошибочно пропустить нужные данные все же выше), при желании можете поэкспериментировать на БД под нагрузкой, выбирая 100 записей со * и одним только полем - phpMyAdmin умеет показывать время выполнения запроса.
P.S. а логи с запросами у вас не полные - там явно видны хвосты. либо вы некорректно их скопировали, либо хостер от вас отмахнулся не потрудившись полностью скопировать

Отредактировано Vladislav (2013-08-02 18:29)

Неактивен

 

#23 2013-08-02 20:19

jekky25
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

sirhc написал:

Ясно.

И ещё, что значит t1.* в запросе к базе:

полный запрос к бд пишется как

SELECT t.имяПоля FROM имяТаблицы as t WHERE t.имяПоля = условие

При выборке из одной таблицы префикс t (кстати необязательно t можно как угодно назвать) опускается. Если выборка идет сразу из нескольких таблиц, то префиксы ставят (хотя и не везде). Это позволяет избежать путаницы при запросе и заброс будет корректно обработан.

Неактивен

 

#24 2013-08-03 21:19

komkom
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

Очень полезная получилась ветка, спасибо всем кто здесь отписался)

Неактивен

 

#25 2013-08-05 13:46

sirhc
Пользователь

Re: Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

В итоге сайт включили только после того, как я оптимизировал запросы к базе, хотя надо сказать, что сайт стал работать гораздо быстрее. Сделано было следующее:

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

Как же с этим бороться?

Неактивен

 
  • Главная
  •  » Хостинг
  •  » Nic.ru отключил сайт. Помогите оптимизировать базу СРОЧНО!

Board footer

Powered by PunBB