0

我在 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;

我将 MySQL 服务器从 5.1(32 位)更改为 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 

由于服务器更改,查询永远不会完成,显示消息“查询正在执行...”

有人知道为什么会这样吗?

4

1 回答 1

0

至少你有索引问题:

  • facturacion_2012_drm_emitidas您过滤activa但没有可用于此的索引时
  • facturacion_2012_drm_base您没有索引fechadocumento可以使用的情况下
  • facturacion_2012_drm_cortes你没有索引fecha_inicialfecha_final
  • 我不知道你是否有索引问题,facturacion_motors_pendientes因为你没有为它包含 DDL。

确保你的查询有正确的索引,然后看看会发生什么。现在发生的情况是您有一个复杂的子查询连接,并且基本上没有一个使用索引,要求您对所有涉及的表执行全表扫描。

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

于 2013-08-22T15:32:22.407 回答