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