MySQL очень медленно на очень простом запросе - PullRequest
0 голосов
/ 03 февраля 2020

Я получаю очень медленный ответ, выполняя очень простой запрос в маленькой таблице (115 тыс. Записей) ... Для ответа требуется около 8se c, и я не могу понять, почему он так долго. Любой совет был бы замечательным

Таблица:

CREATE TABLE `financeiro_fluxo` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `branch` int(10) unsigned NOT NULL,
  `abertura` int(10) DEFAULT NULL,
  `origem` int(10) unsigned DEFAULT NULL,
  `status_pagamento` tinyint(3) unsigned DEFAULT NULL,
  `conta` int(10) unsigned NOT NULL,
  `tipo_lancamento` tinyint(3) unsigned NOT NULL,
  `categoria` int(10) unsigned NOT NULL,
  `tipo_entidade` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `entidade` int(10) unsigned DEFAULT NULL,
  `entidade_input` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `tipo_pagamento` tinyint(3) unsigned NOT NULL,
  `parcela` smallint(5) unsigned NOT NULL,
  `parcelas` smallint(5) unsigned NOT NULL,
  `valor` decimal(12,2) NOT NULL,
  `valor_taxa` decimal(12,2) DEFAULT NULL,
  `valor_troco` decimal(12,2) DEFAULT NULL,
  `confirmado` tinyint(3) unsigned DEFAULT NULL,
  `data_confirmacao` datetime DEFAULT NULL,
  `vencimento` date NOT NULL,
  `info` varchar(510) COLLATE utf8_unicode_ci DEFAULT NULL,
  `bandeira` int(10) unsigned DEFAULT NULL,
  `user_add` int(10) unsigned NOT NULL,
  `user_last` int(10) unsigned NOT NULL,
  `param_ref` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
  `param` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `file` int(10) unsigned DEFAULT NULL,
  `date_created` datetime NOT NULL,
  `date_modified` datetime NOT NULL,
  `status` smallint(6) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=116749 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Запрос:

SELECT * from financeiro_fluxo

Объясните:

id  select_type     table               type    key   key_len   rows   
1   SIMPLE          financeiro_fluxo    ALL                     116244  

Тот же запрос выполняется на localhost с той же таблицей возвращает менее чем за c ...

Профиль:

Pofile:

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Будут ли "отчеты" агрегировать данные? Таким образом, вы можете ускорить 8-секундный (удаленный) запрос, выполняя больше работы на сервере, тем самым передавая меньше данных по проводам.

То есть, подумайте, AVG(..), COUNT(*), SUM(..), MAX(..), et c это можно сделать в SELECT.

. Сделав еще один шаг ... Постройте и ведите «Сводную таблицу» с промежуточными итогами (et c). Затем чтение (или сканирование) сводной таблицы и суммирование промежуточных итогов и т. Д. c будет еще быстрее, как на сервере, так и по сети.

(И я согласен с необходимостью избегать *, и что 8 секунд, вероятно, связаны с задержкой в ​​сети (и «пропускной способностью»). Где географически расположен сервер? Сколько времени занимает SELECT 1;?)

0 голосов
/ 03 февраля 2020

Похоже, что вы выполняете полное сканирование таблицы, потому что ваш запрос не содержит никаких ограничивающих условий (например, предложение WHERE или LIMIT). Чтобы форма запроса была лучше, используйте индексированные столбцы с некоторыми критериями. Что произойдет, если вы добавите WHERE id IS NOT NULL

Я предполагаю, что вам нужны все записи, если не ограничивает результирующий набор добавленными условиями в более конкретном предложении c WHERE (для индексированного столбца) или предложении LIMIT .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...