Performance-субботник. Чистим сайты после обновления с Drupal 5 на 6 и с 6 на 7

Главные вкладки

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 18 июля 2011 в 22:21

Немного теории

Индекс (англ. index) — объект базы данных, создаваемый с целью повышения производительности поиска данных. Таблицы в базе данных могут иметь большое количество строк, которые хранятся в произвольном порядке, и их поиск по заданному критерию путем последовательного просмотра таблицы строка за строкой может занимать много времени. Индекс формируется из значений одного или нескольких столбцов таблицы и указателей на соответствующие строки таблицы и, таким образом, позволяет искать строки, удовлетворяющие критерию поиска. Ускорение работы с использованием индексов достигается в первую очередь за счёт того, что индекс имеет структуру, оптимизированную под поиск — например, сбалансированного дерева.

Википедия

Для тех кто не понял

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

И чего ты этим сказать хотел?

Ещё работая в IT-Patrol была замечена интересная статистика, а именно:
старые сайты имели большие показатели неиндексированного чтения и проблемы с производительностью. Естественно, в голове это не совсем укладывалось, так как с виду вполне себе обычный сайт, но работает медленно и даёт нехилую нагрузку по БД.
Изначально это связывалось с кривыми модулями и другими физическими ущербностями.
Потом при обновлении fermer.ru я столкнулся с тем, что отпали индексы по fid в таблице files.
Время шло, вышла семёрка, начались апдейты на неё, при апдейте hr-portal.ru было замечено отпадение индексов и даже то, что некоторые индексы давно отсутствовали, но портал более менее нормально работал на шестёрке.
Дело в том, что между версиями меняется структура БД и при накладках во время апдейта, старый индекс удаляется за ненадобностью, а новый не создаётся, например, из-за дублей, так бывает в таблице blocks.
В итоге мы получаем с виду работающий сайт, но внутри имеем вот такие грабли

Как диагностировать?

Очень просто, Устанавливаем модуль Schema
Сразу хотелось бы предупредить что в версии модуля для Drupal 7 наблюдается баг с префиксами БД, данные которые даёт модуль по БД с префиксом некорректны.
Идём в admin/build/schema/report
Перед нами предстанет страница подобная этой

Легенда:
На желтом фоне пишутся предупреждения, в большинстве случаев они говорят о том, что авторы некоторых модулей не читали раздел про типы полей на api.drupal.org.
Филдсет Match несёт информацию о таблицах которые совпадают со схемой.
Mismatch сообщает нам о таблицах в которых проблемы со схемой.
Extra это таблицы в БД, которые не связаны схемой ни с одним модулем.

Рассмотрим подробнее Mismatch.


primary key: missing in database
Говорит о том, что потерян первичный индекс.
Ещё возможен вариант потери обычного индекса, например:

indexes content_type_uid: missing in database

И чего мне теперь делать, я же спать не буду?!
Вооружаемся текстовым редактором, просматриваем install-файлы модулей, смотрим там hook_schema() и восстанавливаем индексы соответствующими запросами:
ADD INDEX [index_name] (index_col_name,...)
или ADD PRIMARY KEY (index_col_name,...)
или ADD UNIQUE [index_name] (index_col_name,...)
или ADD FULLTEXT [index_name] (index_col_name,...)
Не забываем, что индексы бывают разных типов - составные, уникальные, простые и т.п.

ПЧП, КСС, это всё сложно для меня, может вы сможете помочь?
Я помогу вам за 1000р или эквивалент, я приведу отпавшие индексы в порядок и добавлю свои наработки.
И кстати, если вы клиент Патруля более трёх месяцев, то на вас распространяется 50% скидка, если вы пришли на IT-Patrol менее 3 месяцев назад, то стоимость составит 750р за проблемный сайт, просто напишите в техническую поддержку.

ВложениеРазмер
Иконка изображения schema.png30.24 КБ
Иконка изображения missingindex.png22.48 КБ
Иконка изображения missingindex2.png13.54 КБ

Комментарии

Аватар пользователя Andruxa Andruxa 19 июля 2011 в 1:39

"RxB" wrote:
старые сайты имели большие показатели неиндексированного чтения и проблемы с производительностью.

в закладки
может, и мой сайт когда-нибудь доживет до таких вещей

Аватар пользователя Cyber Cyber 19 июля 2011 в 1:56

Ага. Спасибо огромное, кое что прояснило.

Кстати там вкладка есть SQL. Иногда помогает тупым копипастом и правкой запроса с последующим скармливанием в консоль или phpMyAdmin.

Аватар пользователя Drupal Coder Drupal Coder 21 июля 2011 в 23:37

Отличный пост, спасибо! Не знал этот модуль, как раз сейчас перевожу D5->D6, попробую.

Кстати если в ходе апгрейда Drupal индекс не удается создать, то об этом написано в логе Drupal.

Аватар пользователя seaji seaji 22 июля 2011 в 1:36

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

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 22 июля 2011 в 1:58

Капитан, перелогиньтесь.
Совет звучит как "Занимайтесь оптимизацией, будет счастье".
К тому же, если речь про обычный мускуль с обычным slow-log, то это не самый лучший вариант для тюнинга, бездумное раскидывание индексов тоже не всегда приводит к нужному результату

Аватар пользователя seaji seaji 22 июля 2011 в 2:13

Эх, была не была.
Расскажу страшную сказку на ночь.
Однажды, в незапамятные времена, один супер-гуру в Друпал решил супер-мега оптимизировать Друпал. И он сделал во все базе данных данные с типом материала пречислимым полем. Перечислимые поля супер мега индексируются, и запросов таких хватает, значи имеем мега-выиигрыщ.
И все работало супер, шло время, недели складывались в месяца. Супер-гуру уже давно забыл о этом сайтике. Как вдруг....
Его попросили добавить новый тип материала на сайт...
Тип добавился, но новые материалы так и не создались....
Супер-гуру посыпал голову пеплом, пока не всмотнил, про тип поля.

Аватар пользователя Niklan Niklan 22 июля 2011 в 8:45

Очень интересное предложение. Какраз то что искал.
Являясь пользователем drupalhosting что я должен буду предоставить Вам для работы, а также как пройдет оплата услуги?
Т.е. Вы зайдете в бд и все приведете в нужный вид и почините кривые таблицы, я правильно понял?
Ах да, сроки?

Аватар пользователя Softovick Softovick 22 июля 2011 в 9:08

"Niklan" wrote:
Очень интересное предложение. Какраз то что искал.
Являясь пользователем drupalhosting что я должен буду предоставить Вам для работы, а также как пройдет оплата услуги?
Т.е. Вы зайдете в бд и все приведете в нужный вид и почините кривые таблицы, я правильно понял?
Ах да, сроки?

"RxB" wrote:
просто напишите в техническую поддержку.

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 22 июля 2011 в 9:28

"Niklan" wrote:

Являясь пользователем drupalhosting что я должен буду предоставить Вам для работы, а также как пройдет оплата услуги?

Создайте тикет на support@drupalhosting.ru, где обозначьте своё желание.
От вас нужен будет админский пароль, в БД я зайду по данным из друпала.
Оплата происходит списанием с личного счёта в Drupalhosting по окончанию работ, возможен вариант постоплаты в течении нескольких дней.
Сроки - если сегодня напишите, то сегодня вечером уже будете с индексами

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 22 июля 2011 в 10:33

"vitg" wrote:

Эти таблицы лишние?


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

Аватар пользователя Niklan Niklan 25 июля 2011 в 10:34

Заказал. Почистили базу от левых таблиц, поправили мои косяки после переноса с 6 на 7 версии.
Остался доволен и ценой и работой! Рекомендую на хостинге добавить данную и подобные функции за отделную плату на постоянной основе.

Аватар пользователя Cyber Cyber 25 июля 2011 в 12:45

"Niklan" wrote:
Заказал. Почистили базу от левых таблиц, поправили мои косяки после переноса с 6 на 7 версии.
Остался доволен и ценой и работой! Рекомендую на хостинге добавить данную и подобные функции за отделную плату на постоянной основе.

Земляк, стукнись в скайп.

Аватар пользователя Geldora Geldora 3 августа 2011 в 15:57

Только вернулась с отпуска, из-за этого поднимаю тему Smile

В общем, мне РхБ делал такую штуку, как старому клиенту хостинга, и даже бесплатно Wink Сайт - визуально стал легче работать. Но главное, нагрузка на хостинге снизилась чуть-ли не в разы! Доходила до десятков процентов от можности процессора, сейчас вернулась к нормальным 2-3%. Вот.

Мне кажется, нужно обязательно чистить так сайты, особенно, если переход с 5ки на 6ку делался не специалистом. И обязательно нужно чистить все перед переходом на 7ку.

Аватар пользователя vitg vitg 10 ноября 2015 в 11:47

Если есть несовпадающие индексы, то на вкладке compare (сравнить) они должны сами появиться? (перешел на 7.x)

Получается, что на прикрепленном скриншоте все нормально с БД?