Size: a a a

2020 November 15

IZ

Ilia Zviagin in MySQL
Sasha Sorochynskyi
сайт не работает
Так причина наверное есть какая-то? Ошибки там, диагностика
источник

G

Grigorij in MySQL
В general_log попадают абсолютно все запросы в базу.
Тебе бы лучше в error_log посмотреть
источник

G

Grigorij in MySQL
проверить поднята ли база. Доступна ли. Если всё ок, то посмотреть логи аппликации.
источник

ES

Evgeniy Shklyar in MySQL
Всем привет! Нужна помощь, не понимаю, в чём дело.

Есть большая (~10 000 строк) база результатов разных игр в формате id, game, name, score1.
Нужно вывести топ-10 игроков по лучшему из их результатов. Таблица выводится на сайт через PHP. Очень медленно.

Написал такой запрос:
SELECT name,
         (SELECT score1
         FROM scores b where a.name=b.name and game=9 and score2=1 ORDER BY CAST(score1 as DECIMAL(9,4)) desc limit 1) as sc1
         FROM scores a WHERE game=9 GROUP BY name order by CAST(sc1 as DECIMAL(9,4)) desc limit 10


Но
он отрабатывает за 11-12 секунд. Как ускорить — пока не понимаю.
Всё осложняется тем, что score1 численный, но хранится как varchar, и быстро это не исправить. Предполагаю, что всё замедляет cast, но не уверен.

Буду раз любым советам, как ускорить это дело.
источник

🇻

🇻 🇱 🇦 🇩 in MySQL
Evgeniy Shklyar
Всем привет! Нужна помощь, не понимаю, в чём дело.

Есть большая (~10 000 строк) база результатов разных игр в формате id, game, name, score1.
Нужно вывести топ-10 игроков по лучшему из их результатов. Таблица выводится на сайт через PHP. Очень медленно.

Написал такой запрос:
SELECT name,
         (SELECT score1
         FROM scores b where a.name=b.name and game=9 and score2=1 ORDER BY CAST(score1 as DECIMAL(9,4)) desc limit 1) as sc1
         FROM scores a WHERE game=9 GROUP BY name order by CAST(sc1 as DECIMAL(9,4)) desc limit 10


Но
он отрабатывает за 11-12 секунд. Как ускорить — пока не понимаю.
Всё осложняется тем, что score1 численный, но хранится как varchar, и быстро это не исправить. Предполагаю, что всё замедляет cast, но не уверен.

Буду раз любым советам, как ускорить это дело.
1. 10к строк - небольшая таблица
источник

🇻

🇻 🇱 🇦 🇩 in MySQL
2. переписать запрос на join (хотя это скорее всего и так делает оптимизатор)
3. как решение в лоб - поставить многостолбцовый индекс на столбцы game,score2 (важно в этом порядке) - уже будет индекс с 1 звездой
источник

🇻

🇻 🇱 🇦 🇩 in MySQL
4. избавится от cast в orderby через виртуальный столбец, и добавить его в индекс
источник

ES

Evgeniy Shklyar in MySQL
Спасибо. Пока для меня это звучит как магия, буду разбираться, что это всё такое.
источник

🇻

🇻 🇱 🇦 🇩 in MySQL
Evgeniy Shklyar
Спасибо. Пока для меня это звучит как магия, буду разбираться, что это всё такое.
если магия - просто сделай 3 пункт
источник

DE

Denis Efremov in MySQL
Evgeniy Shklyar
Спасибо. Пока для меня это звучит как магия, буду разбираться, что это всё такое.
У тебя на PHP прямой запрос написан?
источник

DE

Denis Efremov in MySQL
Что такое score2?
источник
2020 November 16

V

Vova in MySQL
Evgeniy Shklyar
Всем привет! Нужна помощь, не понимаю, в чём дело.

Есть большая (~10 000 строк) база результатов разных игр в формате id, game, name, score1.
Нужно вывести топ-10 игроков по лучшему из их результатов. Таблица выводится на сайт через PHP. Очень медленно.

Написал такой запрос:
SELECT name,
         (SELECT score1
         FROM scores b where a.name=b.name and game=9 and score2=1 ORDER BY CAST(score1 as DECIMAL(9,4)) desc limit 1) as sc1
         FROM scores a WHERE game=9 GROUP BY name order by CAST(sc1 as DECIMAL(9,4)) desc limit 10


Но
он отрабатывает за 11-12 секунд. Как ускорить — пока не понимаю.
Всё осложняется тем, что score1 численный, но хранится как varchar, и быстро это не исправить. Предполагаю, что всё замедляет cast, но не уверен.

Буду раз любым советам, как ускорить это дело.
Перепиши запрос, это какой-то трёхэтажный ад
источник

ES

Evgeniy Shklyar in MySQL
Vova
Перепиши запрос, это какой-то трёхэтажный ад
Да, я уже. Теперь и без индекса летает.

SELECT NAME, MAX(CAST(score1 as DECIMAL(9, 3))) AS hiscore
FROM
   scores
WHERE
   game=9 and score2=1
GROUP BY NAME
ORDER BY
   hiscore
DESC
LIMIT 10
источник

V

Vova in MySQL
Evgeniy Shklyar
Да, я уже. Теперь и без индекса летает.

SELECT NAME, MAX(CAST(score1 as DECIMAL(9, 3))) AS hiscore
FROM
   scores
WHERE
   game=9 and score2=1
GROUP BY NAME
ORDER BY
   hiscore
DESC
LIMIT 10
источник

DE

Denis Efremov in MySQL
Evgeniy Shklyar
Да, я уже. Теперь и без индекса летает.

SELECT NAME, MAX(CAST(score1 as DECIMAL(9, 3))) AS hiscore
FROM
   scores
WHERE
   game=9 and score2=1
GROUP BY NAME
ORDER BY
   hiscore
DESC
LIMIT 10
SELECT
      NAME,
      MAX(CAST(score1 as DECIMAL(9, 3))) AS hiscore
 FROM
      scores
WHERE game=9
  AND score2=1
GROUP BY NAME
ORDER BY hiscore DESC
LIMIT 10

.Почитал бы стайлгайд по написанию запросов
источник

T

Taras in MySQL
Подскажите как проще составить запрос, нужно 1 значение таблицы МИНУС  другой с этой же таблицы. Аля

SELECT num1
FROM table Where id =1
MINUS
SELECT num2
FROM table Where id =2;
источник

V

Vova in MySQL
Вроде так и написать
источник

t

toshap2 in MySQL
Taras
Подскажите как проще составить запрос, нужно 1 значение таблицы МИНУС  другой с этой же таблицы. Аля

SELECT num1
FROM table Where id =1
MINUS
SELECT num2
FROM table Where id =2;
SELECT a.num1 - b.num2
FROM foo a, foo b
WHERE a.id =1 AND b.id =2;
источник

T

Taras in MySQL
toshap2
SELECT a.num1 - b.num2
FROM foo a, foo b
WHERE a.id =1 AND b.id =2;
Спасибо большое! 👍
источник

DE

Denis Efremov in MySQL
@HaHLSD спроси тут @js_lib
источник