Рассмотрим таблицу значений и хэши, например, так:
+------------+----------+------+-----+---------+----------------+
| 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столбцу (не проиндексированному) .