V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
zzuyanan
V2EX  ›  MySQL

wordpress 发现 mysql 执行这条语句时间太长了,咋优化?

  •  
  •   zzuyanan · 2017-10-22 02:12:18 +08:00 · 5085 次点击
    这是一个创建于 2616 天前的主题,其中的信息可能已经有所发展或是发生改变。
    show full processlist:
    语句如下:Copying to tmp table | SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (749) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 24 |

    这似乎是在检索某个分类下的最新的文章,但是执行时间高达 103 秒,难道是数据量太大,大约 600 万文章吧,那也不至于这么慢? vps 配置也不低啊,6 核 8G 内存,ssd 硬盘。 请教各位 了!
    15 条回复    2017-12-03 12:43:31 +08:00
    msg7086
        1
    msg7086  
       2017-10-22 05:58:39 +08:00
    600 万文章用 WP 你不定制的话这配置我觉得跑不动。
    隔壁有个 60 万文章的用 DLE (号称比 WP 快?)独服都跑不动,老老实实定制完,双核 VPS 就能随便跑了。
    abccccabc
        2
    abccccabc  
       2017-10-22 08:36:26 +08:00
    个人感觉 wordpress 的表结构设计不好,posts 表数据一大,死翘翘。

    SQL_CALC_FOUND_ROWS 在速度上会比 COUNT(*)慢很多,具体有多慢,取决于你的索引还有一些别的因素, count 大约要比 SQL_CALC_FOUND_ROWS 快上 10 倍.

    https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/
    zzuyanan
        3
    zzuyanan  
    OP
       2017-10-22 09:44:52 +08:00
    @msg7086 哪里有定制啊 ,请教了
    zzuyanan
        4
    zzuyanan  
    OP
       2017-10-22 09:55:56 +08:00
    @msg7086 另外 DLE 是啥?
    msg7086
        5
    msg7086  
       2017-10-22 10:58:23 +08:00
    @zzuyanan DLE = Datalife Engine
    哪里有定制?我也不知道。把预算和定制需求报出去问问看咯。
    wdlth
        6
    wdlth  
       2017-10-22 11:11:18 +08:00
    有些功能不常用的可以把它精简一下,像这个功能的结果你可以先缓存起来,毕竟不是所有时候都需要更新最新文章列表。
    zzuyanan
        7
    zzuyanan  
    OP
       2017-10-22 11:35:59 +08:00
    @wdlth 我目前就是这种思路,每天定时更新最新文章 3 次并缓存,但是每次更新都得要 2 个小时啊,因为分类很多,如果每个分类我只更新前 20 页的内容,也需要很长时间啊
    zzuyanan
        8
    zzuyanan  
    OP
       2017-10-22 11:37:50 +08:00
    @msg7086 问了报价,8000 !
    AlwaysBehave
        9
    AlwaysBehave  
       2017-10-22 11:50:49 +08:00
    @zzuyanan 算很便宜的吧,按照现在这个“趋势”
    你具体需求是什么?实时更新?
    zzuyanan
        10
    zzuyanan  
    OP
       2017-10-22 13:52:18 +08:00
    @AlwaysBehave 其实就是让分类页的最新文章能够快速显示出来,现在表太大 40G,显示的太慢了。
    rogwan
        11
    rogwan  
       2017-10-22 16:21:37 +08:00
    @zzuyanan Copying to tmp table 你这个不是建一个临时的新文章表吗?这个 copy 任务可以定时后台执行,用户数据直接从 tmp table 里读取最新文章,和主表多大无论几十 G 都没有关系了。
    zzuyanan
        12
    zzuyanan  
    OP
       2017-10-22 19:16:16 +08:00
    @rogwan 这个思路好,从临时表里抽数据
    zzuyanan
        13
    zzuyanan  
    OP
       2017-10-22 19:19:09 +08:00
    @abccccabc 是的,所以我准备再建立一个 wp_posts_1 表,只放最新的 10000 条记录,然后从这个表抽取数据,经过测试非常快。但是问题来了,如何让 wordpress 从 wp_posts_1 表里提取数据呢?要知道默认都是从 wp_posts 表提取的,wp_query 并没有提供改表的参数啊
    aksoft
        14
    aksoft  
       2017-11-21 15:08:57 +08:00
    随便问一句,这个是什么网站。。
    likuku
        15
    likuku  
       2017-12-03 12:43:31 +08:00
    @zzuyanan 没有参数,那就去改 wp 源代码了哦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1196 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:22 · PVG 02:22 · LAX 10:22 · JFK 13:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.