У меня есть таблица SQL readings
что-то вроде:
id int
client_id int
device_id int
unique index(client_id, device_id)
Я не понимаю, почему следующий запрос такой медленный:
SELECT client_id FROM `readings` WHERE device_id = 10 ORDER BY client_id DESC LIMIT 1
Я понимаю, что с индексом mysql хранит упорядоченный список (одно свойство btree) каждой строки в таблице, отсортированный сначала по client_id, а затем по device_id. Когда я выполняю объяснение по этому запросу, он говорит, что будет использовать индекс, но ему нужно будет просмотреть каждую строку. Это имеет смысл, поскольку в худшем случае может быть только одна строка с device_id = 10, и это также может быть строка с наименьшим client_id и, следовательно, в конце его поиска. Однако на практике это не так. В моей таблице ~ 10 миллионов строк, и строки с device_id = 10 распределены по этой таблице довольно равномерно. Почему тогда MySQL не запускается в конце индекса и не сканирует, пока не найдет первую строку с device_id = 10, не остановится и не вернет это значение? Кажется невозможным, что это происходит, поскольку выполнение запроса занимает ~ 30 секунд.
Неужели мой уникальный ключ каким-то образом реализован в виде хэша и поэтому недоступен в виде списка? PHPMyAdmin говорит мне, что он реализован в виде b-дерева, что заставляет меня думать, что он должен быть в состоянии выполнить сканирование, как я упоминал выше, и завершить работу с первым экземпляром.
Где моя ошибка и как я могу выполнить этот запрос быстрее?
Спасибо