0

MySQL に 3 つのテーブルがあります。

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がない場合、fechaまたはdocumento使用できる
  • またはのインデックスfacturacion_2012_drm_cortesがありませんfecha_inicialfecha_final
  • facturacion_motors_pendientesDDL が含まれていないため、インデックスに問題があるかどうかはわかりません。

クエリに適切なインデックスがあることを確認してから、何が起こるかを確認してください。現在起こっているのは、サブクエリとの複雑な結合があり、基本的にどれもインデックスを使用していないため、関連するすべてのテーブルでフル テーブル スキャンを実行する必要があるということです。

これらのテーブルを InnoDB に変換することも検討してください。これは 5.6 で優先されるテーブル タイプです。これはもちろん、これらのテーブルで特定の MyISAM 機能 (全文検索など) が必要でない限りです。

于 2013-08-22T15:32:22.407 に答える