РЕДАКТИРОВАТЬ 2: теперь, когда мы оптимизировали базу данных и сузили ее до MySQL - Почему phpMyAdmin очень медленный с этим запросом, который очень быстр в php / mysqli?
EDIT 1: есть два решения, которые нам помогли. Один на уровне базы данных (конфигурации) и один на уровне запроса. Я, конечно, мог бы принять только один как лучший ответ, но если у вас есть похожие проблемы, посмотрите на оба.
У нас есть база данных, которая отлично работает в течение многих лет. Однако прямо сейчас у нас есть проблема, которую я не понимаю. Это проблема конфигурации mysql / InnoDB? И в настоящее время у нас нет никого для обслуживания системы (я программист).
Табель TitelDaggegevens имеет размер несколько гигов, около 12 000 000 записей, так что ничего экстраординарного.
Если мы:
SELECT *
FROM TitelDaggegevens
WHERE fondskosten IS NULL
AND (datum BETWEEN 20200401 AND 20200430)
он работает нормально, в течение нескольких десятых секунды.
Результат: 52 записи.
Также, если мы добавим ORDER BY datum
или сделаем заказ по любому другому неиндексированному полю: все хорошо, та же скорость.
Однако, если я добавлю ORDER BY id
(id является первичным ключом), внезапно запрос займет 15 секунд для тех же 52 записей.
И когда я ORDER BY
другое индексированное поле, время запроса увеличивается до 4-6 минут . Для заказа 52 записей. В индексированном поле.
Я не знаю понятия не имею , что происходит. EXPLAIN мне не помогает. Я оптимизировал / воссоздал таблицу, проверил ее и перезапустил сервер. Все без толку. Я не являюсь экспертом в настройке MySQL или InnoDB, поэтому понятия не имею, с чего начать поиск.
Я просто надеюсь, что, возможно, кто-то поймет это и сможет указать мне правильное направление.
SHOW TABLE STATUS WHERE Name = 'TitelDaggegevens'
Дает мне:
![SHOW TABLE STATUS WHERE Name = 'TitelDaggegevens'](https://i.stack.imgur.com/qW59a.png)
Я знаю, что это очень расплывчатая проблема, но я не могу определить ее более конкретно. Я включил ведение журнала для медленных запросов, но таблица slow_log остается пустой. Я потерялся.
Спасибо за любые идеи, где искать.
Это может помочь кому-то, кто что-то знает об этом, но не мне, советнику phpmyadmins:
![Advisor](https://i.stack.imgur.com/BZoyf.png)
В комментариях и реакции были запрошены выходы EXPLAIN:
1) Без ORDER BY
и с ORDER BY datum
(который находится в WHERE и имеет индекс):
![Without orderby](https://i.stack.imgur.com/cmlaK.png)
2) С ORDER BY
плюс любое поле, кроме datum
(индексированное или нет, поэтому то же самое для быстрых и медленных запросов).
![With order by with indexed fields](https://i.stack.imgur.com/9PPPS.png)
Структура таблицы:
CREATE TABLE `TitelDaggegevens` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`isbn` decimal(13,0) NOT NULL,
`datum` date NOT NULL,
`volgendeDatum` date DEFAULT NULL,
`prijs` decimal(8,2) DEFAULT NULL,
`prijsExclLaag` decimal(8,2) DEFAULT NULL,
`prijsExclHoog` decimal(8,2) DEFAULT NULL,
`stadiumDienstverlening` char(2) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
`stadiumLevenscyclus` char(1) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
`gewicht` double(7,3) DEFAULT NULL,
`volume` double(7,3) DEFAULT NULL,
`24uurs` tinyint(1) DEFAULT NULL,
`UitgeverCode` varchar(4) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
`imprintId` int(11) DEFAULT NULL,
`distributievormId` tinyint(4) DEFAULT NULL,
`boeksoort` char(1) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
`publishingStatus` tinyint(4) DEFAULT NULL,
`productAvailability` tinyint(4) DEFAULT NULL,
`voorraadAlles` mediumint(8) unsigned DEFAULT NULL,
`voorraadBeschikbaar` mediumint(8) unsigned DEFAULT NULL,
`voorraadGeblokkeerdEigenaar` smallint(5) unsigned DEFAULT NULL,
`voorraadGeblokkeerdCB` smallint(5) unsigned DEFAULT NULL,
`voorraadGereserveerd` smallint(5) unsigned DEFAULT NULL,
`fondskosten` enum('depot leverbaar','depot onleverbaar','POD','BOV','eBoek','geen') COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ISBN+datum` (`isbn`,`datum`) USING BTREE,
KEY `UitgeverCode` (`UitgeverCode`),
KEY `Imprint` (`imprintId`),
KEY `VolgendeDatum` (`volgendeDatum`),
KEY `Index op voorraad om maxima snel te vinden` (`isbn`,`voorraadAlles`) USING BTREE,
KEY `fondskosten` (`fondskosten`),
KEY `Datum+isbn+fondskosten` (`datum`,`isbn`,`fondskosten`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=16519430 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci