@coderofbig

Как убрать глюк расчета порядкового номерома в MYSQL таблице?

Здравствуйте. Столкнулся с мега неприятным глюком. Задача найти и посчитать порядковый номер записи с определенным ID в таблице в более чем с 500.000 записями. Делаю запрос:

SELECT rownum, id FROM (
SELECT @rownum := @rownum +1 AS rownum, companies.id
FROM companies, (SELECT @rownum :=0) r
WHERE `companies`.`delete_date` IS NULL
ORDER BY companies.mng_status DESC
LIMIT 5000
) AS src
WHERE src.id =116912


Результат верный. rownum возвращается 27.

Но если я уберу LIMIT 5000 (как и должно быть) или поставлю его польше 14800, то результат вообще странный - rownum = 1472 !

EXPLAIN также показывает разные результаты выполнения:

С LIMIT 5000:

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY ALL NULL NULL NULL NULL 5000 Using where
2 DERIVED system NULL NULL NULL NULL 1
2 DERIVED companies index NULL mng_status 4 NULL 5000 Using where
3 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used

С LIMIT 15000 (или без):

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY ALL NULL NULL NULL NULL 15000 Using where
2 DERIVED system NULL NULL NULL NULL 1 Using filesort
2 DERIVED companies ALL NULL NULL NULL NULL 116937
3 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used

Пожалуйста, помогите. Может что-то с настройками. Но что и где увеличивать не знаю...

Спасибо!
  • Вопрос задан
  • 168 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Noxy
увлекаюсь SQL
Добрый день,
а какие значение в поле companies.mng_status по которому идет сортировка?

предположим что в top 5000 всегда возвращается первые вычитанные данные по индексу со значением mng_status = 1.

в случае когда мы запрашиваем все данные или 15000 скуль решает взять не из индекса, а просканить таблу.

тогда со статусом mng_status = 1 будет много больше данных и конкретный id в ней не обязательно будет в том же месте где был при вычитки из индексе, сортировка в самом индексе может быть другой.

можно попробовать добавить хинт на использование индекса и посмотреть что получится: USE INDEX (col_index)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы