为什么相同的查询在从MySQL服务器上和主MySQL服务器上的解释和执行如此不同?

杰里米·琼斯(Jeremy Jones)

我有一个主MySQL服务器和一个从服务器。数据在它们之间复制。

当我在主服务器上运行此查询时,需要花费几个小时;在从站上需要几秒钟。EXPLAIN计划对此进行备份-从属节点检查的行比主节点少得多。

但是,由于这两个数据库中的结构和数据完全相同(或至少应该相同),并且它们都运行相同版本的MySQL(5.5.31企业版),所以我不明白是什么原因造成的。

这是与此问题(和其他问题类似的症状,但是我认为这不是相同的根本原因,因为我的两个服务器是通过MySQL复制同步的,并且结构和数据内容(或应该是)相同,并且两台服务器上的操作系统和硬件资源完全相同-它们是VMWare,一个是另一个的映像。

我已经验证了两台服务器上每个表中的行数完全相同,并且它们的配置是相同的(从服务器具有指向主服务器的指令除外)。由于没有仔细检查数据本身是否存在任何差异,因此我不确定我还能检查什么,并且感谢您提出任何建议。

查询是

 SELECT COUNT(DISTINCT(cds.company_id))
 FROM   jobsmanager.companies c
 ,      jobsmanager.company_jobsmanager_settings cjs
 ,      jobsmanager.company_details_snapshot cds
 ,      vacancies v
 WHERE  c.company_id = cjs.company_id
 AND    cds.company_id = c.company_id
 AND    cds.company_id = v.jobsmanager_company_id
 AND    cjs.is_post_a_job = 'Y'
 AND    cjs.can_access_jobsmanager = 'Y'
 AND    cjs.account_status != 'suspended'
 AND    v.last_live BETWEEN cds.record_date - INTERVAL 365 DAY AND cds.record_date
 AND    cds.record_date BETWEEN '2016-01-30' AND '2016-02-05';

主人这样解释,在驾驶台上有300万行,没有使用任何键,并且需要一个多小时才能返回结果:

+----+-------------+-------+--------+-------------------------+----------------+---------+---------------------------------+---------+--------------------------+
| id | select_type | table | type   | possible_keys           | key            | key_len | ref                             | rows    | Extra                    |
+----+-------------+-------+--------+-------------------------+----------------+---------+---------------------------------+---------+--------------------------+
|  1 | SIMPLE      | v     | ALL    | job_owner,last_live_idx | NULL           | NULL    | NULL                            | 3465433 |                          |
|  1 | SIMPLE      | c     | eq_ref | PRIMARY                 | PRIMARY        | 4       | s1jobs.v.jobsmanager_company_id |       1 | Using where; Using index |
|  1 | SIMPLE      | cds   | ref    | PRIMARY,company_id_idx  | company_id_idx | 4       | jobsmanager.c.company_id        |     538 | Using where              |
|  1 | SIMPLE      | cjs   | eq_ref | PRIMARY,qidx,qidx2      | PRIMARY        | 4       | jobsmanager.c.company_id        |       1 | Using where              |
+----+-------------+-------+--------+-------------------------+----------------+---------+---------------------------------+---------+--------------------------+

从站使用不同的驱动表,使用索引,预测更多像310,000行,并在几秒钟内返回结果:

+----+-------------+-------+--------+-------------------------+-----------+---------+----------------------------+--------+--------------------------+
| id | select_type | table | type   | possible_keys           | key       | key_len | ref                        | rows   | Extra                    |
+----+-------------+-------+--------+-------------------------+-----------+---------+----------------------------+--------+--------------------------+
|  1 | SIMPLE      | cds   | range  | PRIMARY,company_id_idx  | PRIMARY   | 3       | NULL                       | 310381 | Using where; Using index |
|  1 | SIMPLE      | c     | eq_ref | PRIMARY                 | PRIMARY   | 4       | jobsmanager.cds.company_id |      1 | Using index              |
|  1 | SIMPLE      | cjs   | eq_ref | PRIMARY,qidx,qidx2      | PRIMARY   | 4       | jobsmanager.c.company_id   |      1 | Using where              |
|  1 | SIMPLE      | v     | ref    | job_owner,last_live_idx | job_owner | 2       | jobsmanager.cds.company_id |     32 | Using where              |
+----+-------------+-------+--------+-------------------------+-----------+---------+----------------------------+--------+--------------------------+

我已经在两台服务器上运行了ANALYZE TABLE,OPTIMIZE TABLE和REPAIR TABLE ... QUICK,试图使它们保持一致,但是没有运气。

作为临时解决方案,我可以在从服务器上运行查询,因为它们在cron脚本中,即使它们在从服务器上花费很长时间,也不会像在主服务器上运行时那样增加主服务器上的负载。 。但是,对于任何其他信息,我将不胜感激,这些信息为何它们有所不同,或者我可以检查/修改哪些内容,这可以解释两者之间如此巨大的差异。我唯一能找到的是,从站有更多的可用内存,因为它很少使用。仅此一个原因?如果不是,还有什么?

$ ssh s1-mysql-01 free # master
             total       used       free     shared    buffers     cached
Mem:      99018464   98204624     813840          0     160752   55060632
-/+ buffers/cache:   42983240   56035224
Swap:      4095992    4095992          0
$ ssh s1-mysql-02 free # slave
             total       used       free     shared    buffers     cached
Mem:      99018464   80866420   18152044          0     224772   72575168
-/+ buffers/cache:    8066480   90951984
Swap:      4095992     206056    3889936
$

非常感谢。

阴影

这两个解释之间唯一真正的大区别是,在主数据库上,空缺表上未使用任何索引。

您可以尝试将索引提示(强制索引)放入master的select中,以强制使用job_owner索引。

您还可以尝试在主数据库上与上述查询有关的所有表上运行分析表,以确保更新了表和索引统计信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

主位置未在从主服务器上更新

来自分类Dev

MySQL在不同的服务器上运行不同的索引

来自分类Dev

MySQL在不同的服务器上运行不同的索引

来自分类Dev

使用python在mysql服务器上执行sql脚本

来自分类Dev

CloudServer和本地服务器上的NodeJS日期不同

来自分类Dev

在两个不同的服务器上分析mysql

来自分类Dev

简单的 MySQL 查询不在服务器上运行

来自分类Dev

在不同服务器(相同版本)上执行相同的代码会产生不同的结果

来自分类Dev

mongodb从属服务器上的数据库与主服务器不相同

来自分类Dev

什么在闲置的Linux服务器上使用了如此多的内存?比较“ htop”和“ ps aux”的输出

来自分类Dev

同步 MySQL 和 express 服务器

来自分类Dev

为什么独立的从属服务器无法在单独的Mac OS盒上连接至主服务器?

来自分类Dev

为什么本地服务器上的当前UTC时间与托管服务器上的UTC时间不同?

来自分类Dev

在Node.js上的相同地址上服务WebSocket和HTTP服务器

来自分类Dev

在Node.js上的相同地址上服务WebSocket和HTTP服务器

来自分类Dev

查询在不同服务器上的工作方式不同

来自分类Dev

html 代码在服务器上的执行方式与本地不同

来自分类Dev

生产服务器上的索引操作运行与本地服务器不同的查询

来自分类Dev

是否可以在专用服务器上设置VPN,同时让Web服务器nginx,mysql和其他服务从家里访问被阻止的网站?

来自分类Dev

执行简单查询后,MySQL服务器挂起

来自分类Dev

MySQL服务器执行查询需要很长时间

来自分类Dev

MySql连接查询在本地服务器上有效,但在实时服务器上无效

来自分类Dev

为什么我的jenkins服务器上的不同用户的sqlite版本不同?

来自分类Dev

为什么time()函数在不同的服务器上返回不同的值?

来自分类Dev

使用相同文件的C#压缩在服务器和Windows 10上生成不同大小的输出zip

来自分类Dev

在服务器上执行Java代码

来自分类Dev

仅在服务器上执行代码

来自分类Dev

仅在服务器上执行代码

来自分类Dev

重新启动主服务器后,为什么MySQL复制无法正确恢复?

Related 相关文章

  1. 1

    主位置未在从主服务器上更新

  2. 2

    MySQL在不同的服务器上运行不同的索引

  3. 3

    MySQL在不同的服务器上运行不同的索引

  4. 4

    使用python在mysql服务器上执行sql脚本

  5. 5

    CloudServer和本地服务器上的NodeJS日期不同

  6. 6

    在两个不同的服务器上分析mysql

  7. 7

    简单的 MySQL 查询不在服务器上运行

  8. 8

    在不同服务器(相同版本)上执行相同的代码会产生不同的结果

  9. 9

    mongodb从属服务器上的数据库与主服务器不相同

  10. 10

    什么在闲置的Linux服务器上使用了如此多的内存?比较“ htop”和“ ps aux”的输出

  11. 11

    同步 MySQL 和 express 服务器

  12. 12

    为什么独立的从属服务器无法在单独的Mac OS盒上连接至主服务器?

  13. 13

    为什么本地服务器上的当前UTC时间与托管服务器上的UTC时间不同?

  14. 14

    在Node.js上的相同地址上服务WebSocket和HTTP服务器

  15. 15

    在Node.js上的相同地址上服务WebSocket和HTTP服务器

  16. 16

    查询在不同服务器上的工作方式不同

  17. 17

    html 代码在服务器上的执行方式与本地不同

  18. 18

    生产服务器上的索引操作运行与本地服务器不同的查询

  19. 19

    是否可以在专用服务器上设置VPN,同时让Web服务器nginx,mysql和其他服务从家里访问被阻止的网站?

  20. 20

    执行简单查询后,MySQL服务器挂起

  21. 21

    MySQL服务器执行查询需要很长时间

  22. 22

    MySql连接查询在本地服务器上有效,但在实时服务器上无效

  23. 23

    为什么我的jenkins服务器上的不同用户的sqlite版本不同?

  24. 24

    为什么time()函数在不同的服务器上返回不同的值?

  25. 25

    使用相同文件的C#压缩在服务器和Windows 10上生成不同大小的输出zip

  26. 26

    在服务器上执行Java代码

  27. 27

    仅在服务器上执行代码

  28. 28

    仅在服务器上执行代码

  29. 29

    重新启动主服务器后,为什么MySQL复制无法正确恢复?

热门标签

归档