Die Beschleunigung a (langsam) riesige wordpress-Datenbank
Teste ich ein neues Projekt, das beinhaltet die Verwendung einer wordpress-installation, das hat über 1,5 Millionen Beiträge, in der Regel der Veröffentlichung von Inhalten/Titel ist nur eine Zeile oder zwei - so ganz kurz.
Ich habe bereits die sehr Empfehlenswerte W3-cache-plugin, die viel hilft - aber wenn man erstmal landen auf einer Seite, es dauert eine gute 40-60 laden und generieren einen cache, und mit einer Website, die enthält über 1 Millionen posts, die ich vermute, dass Sie alle Cache ist eine Katastrophe - da nur etwa 5% dieser angesehen wird, auf einer regelmäßigen basis.
Unten ist was Los für einen standard-build für einen post, kann ich irgendetwas tun, um zu ändern/beschleunigen der offensichtliche Flaschenhals? Ich bin mir auch nicht sicher, was die VERKNÜPFUNG tut? sicherlich all das muss geschehen, bekommen Sie post von ID. Die Abfrage, die so lange dauert, wie es aussieht, ist eine Abfrage, um zu zeigen, eine Reihe von posts und bestellen Sie basierend auf Metadaten -, die ich nicht brauchen auf der post-Seite?
[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
)
Unabhängig von der obigen Frage, ich bin auf shared-hosting im momment so ist es offensichtlich nicht gehen, um es zu schneiden, was ich Fragen will ist, wenn Sie, wo laufen diese Art von Website - welche Art von server specs/hosting-plan, den würden Sie suchen, um diese zu bewältigen Größe der installation? Mit ein paar thouand Besuchern zum start pro Woche bewegt sich.
- Sie können vermeiden
select *
und ersetzen mitselect a, b
- könnten Sie erklären, ein wenig mehr? nicht sicher, was genau du meinst
- dies ist nicht hilfreich, ich schlage vor, Sie schließen die Ausführung plan-Ergebnisse (wenn Ihr wisst was ich meine)
Du musst angemeldet sein, um einen Kommentar abzugeben.
1) Verwenden Sie mysqltuner auf WAMP (Sie können nicht installieren Sie auf shared-hosting ohne root) zu Stimmen, MySQL und ändern query-cache, Speicher, etc. Wird einen großen Unterschied machen auf WAMP und die eventuelle live-server. https://github.com/rackerhacker/MySQLTuner-perl
2) löschen Sie post/page Revisionen aus der Datenbank. WP speichern können viele Veränderungen, die große Auswirkungen auf DB-Geschwindigkeit. Ich habe gesehen, DB-Größen fallen 90% nach dem löschen der post/Seite-Revisionen.
Ausführen als SQL-Abfrage in phpmyadmin zu löschen Revisionen; ändern von Tabellen-Präfix als notwendig:
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'
Dann optimieren aller Tabellen. Und dann fügen Sie
define ('WP_POST_REVISIONS', FALSE);
in der Nähe der Spitze der wp-config.php (irgendwo nach der Eröffnung
<?php ...
) deaktivieren Sie zukünftige änderungen.3) Erhöhen Sie den Speicher für php und WP für bessere Leistung:
Bearbeiten Sie die Zeile memory_limit in deiner php.ini auf 128M:
memory_limit = 128M;
Oder fügen Sie die folgende Zeile an der Spitze Ihrer .htaccess-Datei:
php_value memory_limit 128M
Wenn das nicht funktioniert, oder gibt einen Fehler aus, fügen Sie diese Zeile in der Nähe der Spitze Ihrer wp-config.php Datei direkt nach dem öffnen
<?php
define('WP_MEMORY_LIMIT', '128M');
4.) für die endgültige VPS, http konfigurieren.conf für Leistung und nutzen möglicherweise unterschiedliche Kästchen für den MySQL-server selbst.
Shared host offensichtlich auf die Beschränkung der Leistung. Problem ist schlechte hardware, nicht die Abfragen selbst, was Sie also tun müssen, ist erhalten eine dedizierte Maschine für sich selbst. Flaschenhals scheint hier zu sein, MySQL ist in der Regel Datenträger gebunden ist, aber wenn Ihre Website über wachsen wirklich groß, ich würde mit den Vorbereitungen beginnen etwas andere Architektur mit Lastenausgleich für HTTP-und eine leistungsstarke Maschine für MySQL (ich denke, der i7 mit 12 GB ram ist nicht zu teuer und ich würde verwenden, die für den MySQL-server, wenn Sie gehen mit monolithische Daten-Speicher).