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