Ускорение (медленной) огромной базы данных WordPress - PullRequest
4 голосов
/ 24 августа 2011

Я тестирую новый проект, в котором используется установка WordPress, содержащая более 1,5 миллиона сообщений, обычно содержание / заголовок сообщения - это всего лишь одна или две строки, поэтому они довольно короткие.

IУ нас уже есть очень рекомендуемый плагин W3-кеша, который очень помогает, но когда вы впервые попадаете на страницу, для загрузки и генерации его кеша требуется 40-60 секунд, а на сайте содержится более 1 миллионапосты, которые я предполагаю, что их кэширование будет катастрофой - только около 5% из них будут просматриваться на регулярной основе.

Ниже приведено описание стандартной сборки поста,Что я могу сделать, чтобы изменить / ускорить очевидную горлышко бутылки?Я даже не уверен, что делает JOIN?Конечно, все, что должно произойти, это получить сообщение по ID.Запрос, который занимает так много времени, выглядит так, как будто он показывает количество постов и упорядочивает их по метаданным - что мне не нужно на странице поста?

 [5] => Array
    (
        [0] =>  SELECT   wp_posts.* FROM wp_posts  INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1  AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND (wp_postmeta.meta_key = 'wpfp_favorites' ) GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value+0 ASC LIMIT 0, 1
        [1] => 43.2097918987
        [2] => require, require_once, include, get_header, locate_template, load_template, require_once, wp_head, do_action, call_user_func_array, start_post_rel_link, get_boundary_post_rel_link, get_boundary_post, get_posts, WP_Query->query, WP_Query->get_posts, W3_Db->query
    )

[6] => Array
    (
        [0] => SELECT p.* FROM wp_posts AS p  WHERE p.post_date < '0000-00-00 00:00:00' AND p.post_type = 'post' AND p.post_status = 'publish'  ORDER BY p.post_date DESC LIMIT 1
        [1] => 7.29560852051E-5
        [2] => require, require_once, include, get_header, locate_template, load_template, require_once, wp_head, do_action, call_user_func_array, adjacent_posts_rel_link_wp_head, adjacent_posts_rel_link, get_adjacent_post_rel_link, get_adjacent_post, W3_Db->query
    )

[7] => Array
    (
        [0] => SELECT p.* FROM wp_posts AS p  WHERE p.post_date > '0000-00-00 00:00:00' AND p.post_type = 'post' AND p.post_status = 'publish'  ORDER BY p.post_date ASC LIMIT 1
        [1] => 1.78813934326E-5
        [2] => require, require_once, include, get_header, locate_template, load_template, require_once, wp_head, do_action, call_user_func_array, adjacent_posts_rel_link_wp_head, adjacent_posts_rel_link, get_adjacent_post_rel_link, get_adjacent_post, W3_Db->query
    )

[8] => Array
    (
        [0] => SELECT option_value FROM wp_options WHERE option_name = 'theme_mods_twentyeleven' LIMIT 1
        [1] => 1.00135803223E-5
        [2] => require, require_once, include, get_header, locate_template, load_template, require_once, wp_head, do_action, call_user_func_array, _custom_background_cb, get_background_image, get_theme_mod, get_theme_mods, get_option, W3_Db->query
    )

[9] => Array
    (
        [0] => SELECT option_value FROM wp_options WHERE option_name = 'mods_Twenty Eleven' LIMIT 1
        [1] => 8.82148742676E-6
        [2] => require, require_once, include, get_header, locate_template, load_template, require_once, wp_head, do_action, call_user_func_array, _custom_background_cb, get_background_image, get_theme_mod, get_theme_mods, get_option, W3_Db->query
    )

[10] => Array
    (
        [0] => SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('post_format') AND tr.object_id IN (1034759) ORDER BY t.name ASC
        [1] => 1.31130218506E-5
        [2] => require, require_once, include, get_header, locate_template, load_template, require_once, body_class, get_body_class, get_post_format, get_the_terms, wp_get_object_terms, W3_Db->query
    )

[11] => Array
    (
        [0] => SELECT DISTINCT post_author FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' LIMIT 2
        [1] => 1.31130218506E-5
        [2] => require, require_once, include, get_header, locate_template, load_template, require_once, body_class, get_body_class, apply_filters, call_user_func_array, twentyeleven_body_classes, is_multi_author, W3_Db->query
    )

[12] => Array
    (
        [0] => SELECT * FROM wp_posts  WHERE (post_type = 'page' AND post_status = 'publish')  AND ( ID <> 1232798 )    ORDER BY menu_order,wp_posts.post_title ASC
        [1] => 1.00135803223E-5
        [2] => require, require_once, include, get_header, locate_template, load_template, require_once, wp_nav_menu, call_user_func, wp_page_menu, wp_list_pages, get_pages, W3_Db->query
    )

[13] => Array
    (
        [0] => SELECT * FROM wp_users WHERE ID = 4031 LIMIT 1
        [1] => 2.00271606445E-5
        [2] => require, require_once, include, the_post, WP_Query->the_post, setup_postdata, get_userdata, W3_Db->query
    )

[14] => Array
    (
        [0] => SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('post_tag') AND tr.object_id IN (1034759) ORDER BY t.name ASC
        [1] => 1.78813934326E-5
        [2] => require, require_once, include, get_template_part, locate_template, load_template, require, post_class, get_post_class, get_the_tags, get_the_terms, wp_get_object_terms, W3_Db->query
    )

[15] => Array
    (
        [0] => SELECT * FROM wp_comments  WHERE comment_approved = '1' AND comment_post_ID = 1034759 ORDER BY comment_date_gmt ASC 
        [1] => 2.09808349609E-5
        [2] => require, require_once, include, comments_template, get_comments, WP_Comment_Query->query, W3_Db->query
    )

[16] => Array
    (
        [0] => SELECT post_id, meta_value, post_status FROM wp_postmeta LEFT JOIN wp_posts ON post_id=wp_posts.ID WHERE post_status='publish' AND meta_key='wpfp_favorites' AND meta_value > 0 ORDER BY ROUND(meta_value) DESC LIMIT 0, 5
        [1] => 1.50203704834E-5
        [2] => require, require_once, include, get_sidebar, locate_template, load_template, require_once, dynamic_sidebar, call_user_func_array, wpfp_widget_view, wpfp_list_most_favorited, W3_Db->query
    )

Независимо от вышеприведенного вопроса,Сейчас я пользуюсь общим хостингом - так что, очевидно, он не собирается его сокращать, я хочу спросить, есть ли у вас такой сайт, - какой тип сервера / план хостинга вы бы рассматривали, чтобы справиться с этим?размер установки?С несколькими тысячами пусков в неделю, чтобы начать движение вверх.

Ответы [ 2 ]

3 голосов
/ 24 августа 2011

1) Используйте mysqltuner на WAMP (вы не можете установить на виртуальном хостинге без рута), чтобы настроить MySQL и изменить кэш запросов, память и т. Д. Будет иметь огромное значение для WAMP и возможного живого сервера.https://github.com/rackerhacker/MySQLTuner-perl

2) Обязательно удалите ревизии постов / страниц из базы данных.WP может хранить множество ревизий, которые сильно влияют на скорость работы БД.Я видел, как размеры БД упали на 90% после удаления ревизий страниц / страниц.

Запускать как SQL-запрос в phpmyadmin для удаления ревизий;при необходимости измените префикс таблицы:

DELETE a,b,c FROM wp_posts a LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision'

Затем оптимизируйте все таблицы.А затем добавьте

define ('WP_POST_REVISIONS', FALSE);

в верхней части wp-config.php (где-то после открытия <?php ...), чтобы отключить будущие ревизии.

3) Увеличитьпамять для php и WP для лучшей производительности:

Отредактируйте строку memory_limit в вашем php.ini до 128M:

memory_limit = 128M;

Или добавьте эту строку вверхуВаш файл .htaccess:

php_value memory_limit 128M

Если это не сработает или выдает ошибку, добавьте эту строку в верхнюю часть файла wp-config.php сразу после открытия <?php

define('WP_MEMORY_LIMIT', '128M');

4) На последнем VPS настройте http.conf для производительности и, возможно, используйте другое поле для самого сервера MySQL.

2 голосов
/ 24 августа 2011

Общий хост явно достиг предела производительности. Проблема в недостаточном аппаратном обеспечении, а не в самих запросах, поэтому вам нужно будет получить выделенный компьютер для себя. Узким местом здесь, похоже, является MySQL, который обычно привязан к диску, но если ваш сайт собирается стать действительно большим, я бы начал готовить несколько другую архитектуру с балансировщиком нагрузки для HTTP и мощной машиной для MySQL (я думаю, что i7 с 12 гигабайтами Оперативная память не слишком дорога, и я бы использовал ее для сервера MySQL, если вы собираетесь использовать монолитное хранилище данных).

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