残酷的表现从 MySQL 5.6 到 MySQL 5.7
Brutal performance going from MySQL 5.6 to MySQL 5.7
正如标题所暗示的那样,我们在将服务器从 5.6 迁移到 5.7.29 时遇到了残酷的性能问题。我的任务是将几十个 Drupal 站点从 SUSE 服务器 运行ning 5.6 迁移到 Ubuntu 运行nning 5.7.29,这本身就是一种痛苦,但对于一个特定站点来说,数据库快死了。该网站使用分类法对内容进行分类,它确实会产生一些开销,但我在不同的服务器上进行了 运行 多项测试,我们正在 运行 生产和暂存以及 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
首先,任何人都知道为什么会这样,是否有任何服务器或 table 广泛的解决方案?
查询
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
设置optimizer_switch="derived_merge=off";
正如标题所暗示的那样,我们在将服务器从 5.6 迁移到 5.7.29 时遇到了残酷的性能问题。我的任务是将几十个 Drupal 站点从 SUSE 服务器 运行ning 5.6 迁移到 Ubuntu 运行nning 5.7.29,这本身就是一种痛苦,但对于一个特定站点来说,数据库快死了。该网站使用分类法对内容进行分类,它确实会产生一些开销,但我在不同的服务器上进行了 运行 多项测试,我们正在 运行 生产和暂存以及 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
首先,任何人都知道为什么会这样,是否有任何服务器或 table 广泛的解决方案?
查询
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
设置optimizer_switch="derived_merge=off";