Очень очень медленный запрос. Как я могу улучшить это? - PullRequest
1 голос
/ 20 апреля 2011

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

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

У меня есть 3 категории, с идентификатором 3, называемым «Новости», 4 - «Статьи» и 5 - «Другие». Мой код:

<?php
$author = get_query_var('author');
$categories = $wpdb->get_results("
    SELECT DISTINCT(terms.term_id) as ID, terms.name, terms.slug, tax.description
    FROM $wpdb->posts as posts
    LEFT JOIN $wpdb->term_relationships as relationships ON posts.ID = relationships.object_ID
    LEFT JOIN $wpdb->term_taxonomy as tax ON relationships.term_taxonomy_id = tax.term_taxonomy_id
    LEFT JOIN $wpdb->terms as terms ON tax.term_id = terms.term_id
    WHERE 1=1 AND (
        posts.post_status = 'publish' AND
        posts.post_author = '{$post->post_author}' AND
        tax.taxonomy = 'category' )
    ORDER BY terms.term_id ASC
");
?>

<ul>
    <?php foreach($categories as $category) : ?>
<?php if ( ($category->ID == '3')   || ($category->ID == '4')  || ($category->ID == '5')) { ?>
    <li>
        <a href="<?php echo get_category_link( $category->ID ); ?>/?author_name=<?php echo $curuser->user_login; ?>" title="<?php echo $category->name ?>">
            <?php echo $category->name; ?>
        </a>
    </li>
<?php } ?>
    <?php endforeach; ?>
</ul>

Спасибо всем!

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

Судя по внешнему виду базы данных WordPress, которую я лежу, я предполагаю, что нет индекса по столбцам, которые вы используете в предложении WHERE для таблицы wp_posts.

Попробуйтедобавив индекс, подобный этому:

ALTER TABLE wp_posts ADD INDEX (post_author,post_status).

Могу поспорить, что вы увидите увеличение скорости от этого.

Однако лучше всего выполнить этот запрос вручнуюс EXPLAIN перед SELECT и проанализируйте вывод .

0 голосов
/ 20 апреля 2011

Есть ли у вас индексы на posts.ID, relationships.object_ID, relationships.term_taxonomy_id, tax.term_taxonomy_id, tax.term_id, terms.term_id, posts.post_status, posts.post_author и tax.taxonomy?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...