SQL Query займає багато часу, коли багато рядків - mysql, performance

Використання запиту:

SELECT st.*
FROM surf_times st
WHERE st.Time =
(SELECT MIN(t.Time)
FROM surf_times t
WHERE t.SteamID = st.SteamID AND t.Map = st.Map)
AND st.Map = "surf_milkyway"
ORDER BY st.Time
LIMIT 15

Забирає 0,15 ~ секунд з 7 результатами:

Showing rows 0 - 6 (7 total, Query took 0.1650 sec) [Time: 61.76 - 70.05]

Запустивши цей запит у таблиці, яка поверне 15 результатів, вона раптово займає 23 секунди

Showing rows 0 - 14 (15 total, Query took 23.0710 sec) [Time: 47 - 52.13]

"surf_milkyway" має 17 повних рядків і виконує 0.16 ~ секунд.

"surf_beginner" має 2496 рядків і займає 23 ~ секунди для виконання.

Під час пошуку на карті потрібно 20 і більше секунд, і в них багато часу, щоб порівняти та сортувати їх. Чи щось не так з запитом або тим, як таблиця індексується тощо?

Таблиця структурована так:

SteamID - bigint(20)
Name - varchar(255)
Map - varchar(255)
Time - float
Date int(20)
id - int(11) - AUTO_INCREMENT, Primary

Відповіді:

1 для відповіді № 1

Незв'язаний запит завжди буде працювати краще, ніж корельований, але якщо продуктивність все ще є поганою, нам дійсно потрібно побачити таблицю CREATE і результати EXPLAIN ...

SELECT a.*
FROM surf_times a
Join
(SELECT steamid,map, MIN(Time) min_time
FROM surf_times
Group by steamid,map) b
On b.steamid = a.steamid
And b.map = a.map
And b.min_time = a.time
Where a.Map = "surf_milkyway"
ORDER BY a.Time
LIMIT 15

0 для відповіді № 2

Додавання наступних індексів покращить ефективність:

INDEX(Steamid, Map, Time),
INDEX(Map, Time)

Схожі запитання
Найбільш популярний