Рассмотрим таблицу значений и хэши, например, так:
+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| val | char(9) | NO | | NULL | |
| val_hashed | char(50) | YES | | NULL | |
+------------+----------+------+-----+---------+----------------+
Следующий запрос завершается через 0,00 секунды:
SELECT * FROM hashes ORDER BY 1 DESC LIMIT 1;
Однако этот запрос занимает 3 минуты 17 секунд:
SELECT val FROM hashes ORDER BY 1 DESC LIMIT 1;
Я вижу, что во время выполнения запроса список процессов показывает его как статус Sorting result
. Ситуация полностью воспроизводима. Обратите внимание, что существует другой процесс, выполняющий INSERT
операции над таблицей непрерывно.
Почему более конкретный запрос выполняется дольше, чем *
запрос? Я всегда считал, что *
следует избегать запросов специально по соображениям производительности.
ORDER BY NUMBER
Синтаксис весьма подвержен ошибкам.
SELECT *
сочетании с индексом столбца в ORDER BY
запутывает, какой столбец сортируется - еще одна причина избегать *
s ...
*
не является явным. Поэтому говорить «дай мне все столбцы и сортировать по третьему» примерно так же детерминировано, как и говорить «иди в супермаркет и скажи мне, сколько светофоров ты проехал»
id
чтобы найти первую строку. Второй должен отсортировать полный результат поval
столбцу (не проиндексированному) .