wordpress文章采集软件(插件优化wordpress的分类和标签有什么区别?-八维教育)
优采云 发布时间: 2021-12-30 05:13wordpress文章采集软件(插件优化wordpress的分类和标签有什么区别?-八维教育)
一般来说,对于百万文章级别的网站,首页应该是展示很多分类文章的页面。但是因为WP在初始化的时候会根据url里面的query查询数据库中的一些文章,所以首页是按照时间倒序查询的,所以当不需要最新的文章的时候,可以用hook去掉这个查询的一部分。
文章页面优化
看文章页面,好像没有什么耗时查询,基本都是id查询内容,索引用的,但是有翻页问题,有翻页功能可以过滤next和next同类别的文章。,本次查询的sql语句如下
mysql> SELECT p.ID FROM wp_posts AS p
INNER JOIN wp_term_relationships AS tr ON p.ID = tr.object_id INNER JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE p.post_date > '2017-07-04 09:57:50' AND p.post_type = 'post' AND tt.taxonomy = 'category' AND tt.term_id IN (4) AND p.post_status = 'publish' ORDER BY p.post_date ASC LIMIT 1;
使用解释来查看
mysql> explain SELECT p.ID FROM wp_posts AS p INNER JOIN wp_term_relationships AS tr ON p.ID = tr.object_id INNER JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE p.post_date > '2017-07-04 09:57:50' AND p.post_type = 'post' AND tt.taxonomy = 'category' AND tt.term_id IN (4) AND p.post_status = 'publish' ORDER BY p.post_date ASC LIMIT 1\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tt
type: const
possible_keys: PRIMARY,term_id_taxonomy,taxonomy
key: term_id_taxonomy
key_len: 106
ref: const,const
rows: 1
Extra: Using temporary; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: tr
type: ref
possible_keys: PRIMARY,term_taxonomy_id
key: term_taxonomy_id
key_len: 8
ref: const
rows: 5576
Extra:
*************************** 3. row ***************************
id: 1
select_type: SIMPLE
table: p
type: eq_ref
possible_keys: PRIMARY,type_status_date
key: PRIMARY
key_len: 8
ref: aikanwen.tr.object_id
rows: 1
Extra: Using where
3 rows in set (0.19 sec)
看起来像一个灾难站点,这种查询随着分类的增加会变得极其缓慢,因为有时分类和标签可能会达到几万和几十万!
分类优化
和首页一样,只查询分类中的最新文章,甚至是预先生成的静态页面。
插件优化
wordpress最常用的插件可能是wp_postviews,但是对于拥有数百万篇文章的wordpress来说,这个插件可能就是一场灾难(如果用它的排行榜的话)。
此排名将使用如下查询
SELECT wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND (
wp_postmeta.meta_key = 'views'
) AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value+0 DESC LIMIT 0, 10;
这种查询也是一场灾难。对于WP来说,wp_post_meta表中没有meta_key和meta_value的索引,索引根本不能用于排序,所以只能使用filesort,需要全表扫描。你可以看看解释。
mysql> explain SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND ( wp_postmeta.meta_key = 'views' ) AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value+0 DESC LIMIT 0, 10 \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: wp_postmeta
type: ALL
possible_keys: post_id,meta_key
key: NULL
key_len: NULL
ref: NULL
rows: 67053
Extra: Using where; Using temporary; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: wp_posts
type: eq_ref
possible_keys: PRIMARY,type_status_date,post_author
key: PRIMARY
key_len: 8
ref: aikanwen.wp_postmeta.post_id
rows: 1
Extra: Using where
2 rows in set (0.17 sec)
这种排序一次基本上是一场灾难。别说几百万了,十万条条蜘蛛都能干掉他们。
事实上,当文章达到百万时,最好不要使用涉及数据库读写的插件。粗心大意将是一场灾难。
后台优化
后台页面打开时,会查询当前作者的所有文章以及各个状态的文章数。这会扫描整个表,别说是一百万篇文章,连二十万篇文章都会被卡住。
最好的办法就是去掉这些查询,但是去掉这些查询会使后台显示异常,所以只能用缓存来存储这些号码,所以后台速度会很快。虽然会有呈现不及时的问题,但这已经不是文章量的主要问题了。
全站缓存
这是最重要的一步。再多的优化也只能保证你的百万文章网站可以正常打开,但是如果访问的人太多,网站还是会卡住,甚至服务器宕机。这时候就必须使用全站缓存。看了市面上所有的缓存插件,只有一个符合要求——imwpcache。
imwpcache 支持永不过期的缓存,并且支持使用 sqlite 作为缓存,比使用文件缓存更好。文件缓存太散了,几万条还行。当达到一百万时,清理这些缓存简直就是一场灾难。
总结
经过这些优化,支撑百万篇文章基本不成问题。对于普通用户来说,这样做可能会比较困难,尤其是主题。现在市场上的主题基本上不考虑这么大量的文章。一旦文章量上来,网站基本就瘫痪了。所以最好的策略是使用缓存插件。当然,如果你有动手能力,你也可以尝试摆脱这些资源。查询,虽然可能会丢失一些功能,但是可以支持这么多文章来弥补这些损失。
欣赏
微信欣赏
支付宝升值