我有一个主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
$
非常感谢。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句