Главная > Программирование > Решение проблемы в MediaWiki с большими категориями (Large Categories)

Решение проблемы в MediaWiki с большими категориями (Large Categories)

На одном из проектов используется движок MediaWiki. В некоторых особенно больших категориях находится до 40000 статей. После обновления до версии 1.16 было обнаружено, что при заходе на страничку с листингом категории. SQL запрос выполняется более 30 секунд (на не самом медленном сервере).

Пришлось искать решение, но в открытых источниках оно так и не было найдено, так что я посмотрел, как это было сделано в старых версиях движка. Итак, критическое место:

Файл /includes/CategoryPage.php, функция doCategoryQuery(). Проблемный запрос:

$res = $dbr->select(
array( 'page', 'categorylinks', 'category' ),
array( 'page_title', 'page_namespace', 'page_len', 'page_is_redirect', 'cl_sortkey',
'cat_id', 'cat_title', 'cat_subcats', 'cat_pages', 'cat_files' ),
array( $pageCondition, 'cl_to' => $this->title->getDBkey() ),
__METHOD__,
array( 'ORDER BY' => $this->flip ? 'cl_sortkey DESC' : 'cl_sortkey',
'USE INDEX' => array( 'categorylinks' => 'cl_sortkey' ),
'LIMIT' => $this->limit + 1 ),
array( 'categorylinks' => array( 'INNER JOIN', 'cl_from = page_id' ),
'category' => array( 'LEFT JOIN', 'cat_title = page_title AND page_namespace = ' . NS_CATEGORY ) )
);

Заменяем на старую версию:

$res = $dbr->select(
array( 'page', 'categorylinks' ),
array( 'page_title', 'page_namespace', 'page_len', 'page_is_redirect', 'cl_sortkey' ),
array( $pageCondition,
'cl_from = page_id',
'cl_to' => $this->title->getDBkey()),
#'page_is_redirect' => 0),
#+ $pageCondition,
__METHOD__,
array( 'ORDER BY' => $this->flip ? 'cl_sortkey DESC' : 'cl_sortkey',
'USE INDEX' => 'cl_sortkey',
'LIMIT' => $this->limit + 1 ) );

Проблем не обнаружено. Листинг отображается одинаково для обоих версий.

  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.