今天又有朋友遇到这个问题,想通过分表来解决,但是在我看来这是治标不治本的,而且效果可能不怎么好。

根据我个人经验,推荐通过增加数据库索引来解决,一劳永逸。做法如下:

1. 登录phpmyadmin进入数据库,找到archives这个表。(这里用来举例的数据库前缀是‘lw’,数据表名即为lw_archives)

织梦(dedecms)文章太多,速度越来越慢的解决办法-冯金伟博客园

2. 进入lw_archives这个表,点击下图所示的“快速编辑”按钮,显示出命令输入框。

织梦(dedecms)文章太多,速度越来越慢的解决办法-冯金伟博客园

3. 用来添加索引的sql语句是这样的:

CREATE INDEX index_name ON table_name (column_name)
/*
index_name 索引名,可以任意取名,为了以后自己还能看懂,推荐直接用列名
table_name 表名
column_name 列名,即字段名
*/

比如,要为‘click’这个字段添加索引,sql语句为

CREATE INDEX click ON lw_archives (click)
织梦(dedecms)文章太多,速度越来越慢的解决办法-冯金伟博客园

执行后,click这个字段的索引就建好了。

4. 怎么查看这个表都建了哪些索引?语句如下:

SHOW INDEX FROM 表名

5. 索引建错了,要删除怎么办?

DROP index 索引名 ON 表名

以上解决的是sql语句的问题,那么什么样的字段应该建立索引?可以所有字段都建索引吗?
答:索引可以加速查询(“读”操作),但是会拖累更新(“写”操作),所以通常只针对需要大量查询的字段建立索引。这里的查询,包括“查找”和“排序”,也就是sql里面的where和order子句。
比如,我们经常会在模板中调用最新文章,这里就涉及一个排序,按文章生成时间排序,所以应该找到代表文章生成时间的那个字段,添加索引,之后调用最新文章就会明显变快。
织梦中,sortrank、pubdate、senddate都代表文章生成时间(个人理解,如果有误,请拍砖),我是把这三个都做了索引的。
另外,click字段,表示点击量或者叫浏览量,通常调用最热文章会用到,一般也推荐建立索引。
如有其它字段需要建索引,同理即可。

需要强调的是,模板中尽量不要使用随机排序(orderby=‘rand’)这种,它会放弃索引,导致速度奇慢无比。

数据库博大精深,在此抛砖引玉,若有更好的见解,共同讨论,共同进步。

转自:https://www.ucaiyun.com/article/11