2013-08-22 72 views
0

我有在MySQL三个表:与MySQL服务器变化问题

CREATE TABLE `mlm`.`facturacion_2012_drm_base` ( `custid` 
varchar(20) NOT NULL, `fecha` date NOT NULL, `docid` varchar(20) 
NOT NULL, `billid` varchar(20) NOT NULL, `movimiento` varchar(20) 
DEFAULT NULL, `movid` varchar(20) DEFAULT NULL, `medio_pago` 
varchar(40) DEFAULT NULL, `digitos` varchar(20) DEFAULT NULL, 
`monto_facturado` decimal(20,2) NOT NULL, `monto_pagado` 
decimal(20,2) NOT NULL, `monto_usado` decimal(20,2) NOT NULL, 
`documento` varchar(2) NOT NULL, `codigo_pago` varchar(5) DEFAULT 
NULL, `desc_pago` varchar(100) DEFAULT NULL, `sociedad` 
varchar(45) DEFAULT NULL, `sociedad_bonif` varchar(45) DEFAULT NULL, 
KEY `billid` (`billid`), KEY `motors_no_fact` 
(`custid`,`billid`,`fecha`,`documento`) USING BTREE, KEY 
`facturacion` (`custid`,`fecha`,`documento`) USING BTREE) 
ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; 

CREATE TABLE `mlm`.`facturacion_2012_drm_cortes` ( `id` bigint(20) 
NOT NULL AUTO_INCREMENT, `fecha_inicial` date NOT NULL, 
`fecha_final` date NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM 
AUTO_INCREMENT=433 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; 

CREATE TABLE `mlm`.`facturacion_2012_drm_emitidas` ( `id` 
bigint(20) NOT NULL AUTO_INCREMENT, `custid` varchar(20) NOT NULL, 
`fecha_emision` date NOT NULL, `id_fechas` bigint(20) NOT NULL, 
`monto` decimal(20,2) NOT NULL, `iva` decimal(20,2) NOT NULL, 
`total` decimal(20,2) NOT NULL, `medio_pago` varchar(2000) NOT NULL, 
`digitos` varchar(100) NOT NULL, `operaciones` int(10) NOT NULL, 
`activa` varchar(2) NOT NULL, `movimiento` varchar(45) NOT NULL, 
`parcialidades` varchar(100) NOT NULL, `monto_bruto` decimal(20,2) 
NOT NULL, `billid` varchar(45) NOT NULL, `serie` varchar(2) 
DEFAULT NULL, `folio` int(10) DEFAULT NULL, `uuid` varchar(45) 
DEFAULT NULL, PRIMARY KEY (`id`), KEY `motors` 
(`billid`,`id_fechas`,`activa`)) ENGINE=MyISAM AUTO_INCREMENT=511483 
DEFAULT CHARSET=latin1; 

我改变从5.1(32位)MySQL服务器到5.6(64位)和恢复所有我的表,但我有问题与此查询:

SELECT a.custid, 
     a.monto_facturado, 
     a.billid, 
     a.fecha, 
     b.id, 
     b.fecha_inicial 
FROM facturacion_2012_drm_base a, 
     facturacion_2012_drm_cortes b 
WHERE a.custid = ANY (SELECT custid 
         FROM facturacion_motors_pendientes 
         WHERE situacion = 'no facturado') 
     AND a.billid <> ALL (SELECT billid 
          FROM facturacion_2012_drm_emitidas 
          WHERE activa = 'SI') 
     AND a.fecha BETWEEN b.fecha_inicial AND b.fecha_final 
     AND a.documento = 'FA' 
     AND Year(a.fecha) = Year(Curdate()) 
GROUP BY a.billid 

由于服务器发生更改,查询从未完成,显示消息“Query is being executed ...”

任何人都知道为什么会发生这种情况?

+0

在声明前加'EXPLAIN'并运行,然后发布结果。 – Tom

+0

嗨,这就是结果:“id”,“select_type”,“table”,“type”,“possible_keys”,“key”,“key_len”,“ref”,“rows”,“Extra” 1, “PRIMARY”,“facturacion_motors_pendientes”,“ALL”,“”,“”,“”,“”,5,“使用where;使用temporary;使用filesort; Start temporary” 1,“PRIMARY”,“b”, “ALL”,“”,“”,“”,“”,424,“使用连接缓冲区(Block Nested Loop)” 1,“PRIMARY”,“a”,“ALL”,“motors_no_fact,facturacion” “,”“,”“,3875388,”每个记录的检查范围(索引图:0x6);结束临时“ 3,”SUBQUERY“,”facturacion_2012_drm_emitidas“,”索引“,”马达“,”马达“ 59“,”“,419111,”使用where;使用索引“ – Jaymz

回答

0

至少,你有索引问题:

  • facturacion_2012_drm_emitidasactiva筛选,但没有你没有一个指标可以用于此
  • facturacion_2012_drm_base指数fechadocumento可用于
  • facturacion_2012_drm_cortes你没有一个指数fecha_inicialfecha_final
  • 我不知道你在facturacion_motors_pendientes上是否有索引问题,因为你没有包含DDL。

请确保您有适当的索引为您的查询,然后看看会发生什么。现在发生的事情是,你有一个复杂的子查询连接,基本上没有一个利用索引,需要你在所有涉及的表上执行全表扫描。

您也可以考虑将这些表转换为InnoDB,因为这是5.6中的首选表类型。当然,除非你需要这些表格上的某些MyISAM功能(比如全文搜索)。

+0

感谢Mike,在涉及的第四张表(facturacion_motors_pendientes)中,我在”BIGINT(20)“而不是”VARCHAR(20)“中创建了custid,原因MySQL没有使用索引。 – Jaymz

+0

@Jaymz不知道第四个表格,但MYSQL不会在你的查询中使用很多其他的东西,因为那里没有索引,或者列是复合索引的一部分,但不是复合指数中的第一个指数,因此不会使用指数。我只是提到这一点,因为肯定有多个索引需要修复/添加才能使此查询有效运行。 –