Создание временной таблицы значительно ускоряет мой вызов базы данных, почему это так? - PullRequest
1 голос
/ 12 мая 2019

Я невероятно запутался прямо сейчас.

У меня есть веб-сайт с большим количеством данных в нескольких таблицах в моей базе данных. Обычно это не должно быть проблемой из того, что я прочитал. Видимо, это было не так.

Вот мой запрос к таблице d

SELECT SQL_CALC_FOUND_ROWS 
    d.id,
    d.user__id,
    d.submit_date,
    d.title,
    d.view_count,
    d.vote_count
FROM d
WHERE d.submit_date <= DATE_SUB(NOW(), INTERVAL 24 HOUR)
AND d.title != 'No Deck Title'
AND d.is_private != 1
ORDER BY d.id DESC
LIMIT 15;

SELECT FOUND_ROWS();

У меня есть INDEX() на submit_date, и мой PRIMARY_KEY равен id с user__id внешним ключом, связанным с таблицей user на user.id.

Выполнение этого запроса займет более 30 секунд. Я понятия не имею, почему это происходит. Без причины я переключил запрос на это:

DROP temporary table IF EXISTS paging;
CREATE TEMPORARY TABLE paging AS 
SELECT SQL_CALC_FOUND_ROWS d.id,
    d.user__id,
    d.submit_date,
    d.title,
    d.view_count,
    d.vote_count
FROM d
WHERE d.submit_date <= DATE_SUB(NOW(), INTERVAL 24 HOUR)
AND d.title != 'No Title'
AND d.is_private != 1
ORDER BY d.id DESC
LIMIT 15;

SELECT FOUND_ROWS();

SELECT p.id, p.title, p.submit_date, p.view_count, p.vote_count, u.username FROM paging p
INNER JOIN user u on p.user__id = u.id;    

Это возвращает те же самые точные наборы результатов за 0,032 секунды, в соответствии с моим последним вызовом в Workbench.

Может кто-нибудь объяснить мне, почему это происходит, и если это нормально для таблиц с большими объемами данных?

...