2013-08-22 2 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; 

Я изменил сервер MySQL из 5.1 (32 бит), 5.6 (64 Bits) и восстановил все мои таблицы, но у меня возникли проблемы с этим запросом:

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 

Поскольку изменение сервера, запрос никогда не закончить, показывая сообщение «Запрос в настоящее время выполняется ...»

Кто-нибудь знает, почему это происходит?

+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», «Использование временных», «Использование файлов», «Начать временные» 1, «PRIMARY», «b», «ALL», «», «", "", "", 424, "Использование буфера объединения (Block Nested Loop)" 1, "PRIMARY", "a", "ALL", "motors_no_fact, facturacion", " "," "," ", 3875388," Диапазон проверен для каждой записи (индексная карта: 0x6); Временной конец " 3," SUBQUERY "," facturacion_2012_drm_emitidas "," index "," motors "," motors "," 59 "," ", 419111," Использование, где: с помощью индекса " – Jaymz

ответ

0

По крайней мере, у вас есть проблемы индексации:

  • На facturacion_2012_drm_emitidas фильтрации по activa, но не имеют индекс, который может быть использован для этого
  • На facturacion_2012_drm_base вы не имеете индекс для fecha или documento, которые могут быть использованы
  • на facturacion_2012_drm_cortes не имеют индекс для fecha_inicial или fecha_final
  • я не знаете, если у вас есть проблемы с индексами на facturacion_motors_pendientes, потому что вы не включили DDL для него.

Убедитесь, что у вас есть соответствующие индексы для вашего запроса, а затем посмотрите, что произойдет. Сейчас происходит то, что у вас сложное соединение с подзапросами, и в основном ни один из них не использует индексы, требуя, чтобы вы выполняли полное сканирование таблиц во всех задействованных таблицах.

Вы также можете рассмотреть возможность преобразования этих таблиц в InnoDB, так как это предпочтительный тип таблицы в 5.6. Это, конечно, если вам не нужны определенные функции MyISAM в этих таблицах (например, полнотекстовый поиск).

+0

Спасибо Майку, в четвертой таблице (facturacion_motors_pendientes), я был в порядке" BIGINT (20) "вместо" VARCHAR (20) ", так что это было причина, по которой MySQL не использовала индекс. – Jaymz

+0

@Jaymz Не уверен в 4-й таблице, но MYSQL не использовал бы много других вещей, которые вы делаете в своем запросе, так как там либо не были индексы, либо столбцы были частью составного индекса, но не были первым индексом в составном индексе, так что индекс не использовался бы. Я просто упоминаю об этом, так как есть определенно несколько индексов, которые необходимо исправлять/добавлять, чтобы этот запрос выполнялся эффективно. –

Смежные вопросы