【问题标题】:Brutal performance going from MySQL 5.6 to MySQL 5.7从 MySQL 5.6 到 MySQL 5.7 的残酷性能
【发布时间】:2020-02-27 20:41:32
【问题描述】:

正如标题所暗示的,我们将服务器从 5.6 迁移到 5.7.29 的性能非常糟糕。我的任务是将几十个 Drupal 站点从运行 5.6 的 SUSE 服务器迁移到运行 5.7.29 的 Ubuntu,这本身就是一种痛苦,但对于一个特定的站点,数据库正在死去。该网站使用分类法对内容进行分类,这确实会产生一些开销,但我已经在生产和暂存以及 Docker 中运行的不同服务器上运行了几次测试。

在 5.7 上,查询需要大约 100 倍或大约 10-15 秒,具体取决于机器,而 5.6 系统需要 80-120 毫秒。我知道查询很丑陋,肯定可以改进,但它不是一个真正的选择,超出了任务的范围。这是一个 CMS,我想知道是否有办法强制 MySQL 使用特定的查询优化技术。此外,这只是本网站上的众多查询之一,它们都与分类法有关。

我可以从 docker 为任一图像创建新容器,导入转储并获得相同的行为。

docker run -p 127.0.0.1:3306:3306/tcp --name mysql5.6 -e MYSQL_ROOT_PASSWORD=password -d mysql:5.6
docker run -p 127.0.0.1:3307:3306/tcp --name mysql5.7 -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7

首先,任何人都知道它为什么会这样,是否有任何服务器或表范围的解决方案?

Reddit Discussion

解释视觉效果 + 表格 + 索引

查询

SELECT DISTINCT node.nid AS nid, node.title AS node_title, node.created AS node_created, 
       ttdn.name AS ttdn_name, ttdn.vid AS ttdn_vid, 
       ttdn.tid AS ttdn_tid, ttdn_tv.machine_name AS ttdn_tv_machine_name, 
       node.sticky AS node_sticky, 
       'node' AS field_data_field_top_image_node_entity_type, 
       'node' AS field_data_field_summary_node_entity_type, 
       'node' AS field_data_body_node_entity_type, 
       'node' AS field_data_field_tags_node_entity_type  
FROM node
LEFT JOIN (
           SELECT td.*, tn.nid AS nid  
           FROM   taxonomy_term_data td  
           LEFT JOIN taxonomy_vocabulary tv ON td.vid = tv.vid  
           LEFT JOIN taxonomy_index tn ON tn.tid = td.tid  
           WHERE (tv.machine_name IN ('news_categories')) 
           AND   (td.tid IN ('10', '21','23', '24', '25', '26', '27', '28', 
                              '31', '32', '33'/*.. some data removed for brevity*/))) ttdn 
        ON node.nid = taxonomy_term_data_node.nid  
LEFT JOIN taxonomy_vocabulary ttdn_tv ON ttdn.vid = ttdn_tv.vid  
WHERE     (((node.status = '1') 
AND (node.type IN ('news_feed', 'www_news_releases_feed', 'article', 'www_rru_in_the_media_feed')) ))
AND       ( EXISTS (
                    SELECT na.nid AS nid  
                    FROM  node_access na  
                    WHERE (( (na.gid = '0') AND (na.realm = 'all') )OR( (na.gid = '1') 
                    AND (na.realm = 'taxonomy_access_role') ))AND (na.grant_view >= '1') 
                    AND (node.nid = na.nid) ))  
ORDER BY node_sticky DESC, node_created DESC  LIMIT 1 OFFSET 0

【问题讨论】:

  • Here 是您可能希望尽可能使用文本而不是图像的几个原因!但那些计划图像是致命的——你如何生成它们?
  • MySQL 工作台。我明天可以获取表格数据并将其格式化为文本。谢谢。
  • 不,谢谢!我期待着明天花一部分时间生成图表 - 耶! :-)
  • 每条Explain的第一行都不一样——好像表定义不一样??用于该行的索引已从图像中删除 -- 请提供 SHOW CREATE TABLE 作为文本,而不是图像。
  • 嗨 RickJames 数据库是相同的。解决方案是答案中所示的 optimizer_switch。相同查询的解释完全不同。

标签: mysql drupal


【解决方案1】:

设置 optimizer_switch="derived_merge=off";

【讨论】:

    猜你喜欢
    • 2017-09-19
    • 2015-10-11
    • 2021-07-08
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2020-08-22
    相关资源
    最近更新 更多