Это может или не может помочь: измените запрос и добавьте индекс:
SELECT a FROM tbl WHERE b > ? ORDER BY a LIMIT 1;
INDEX(a, b)
Затем , если совпадение b
произойдет достаточно скоро в таблице, это будетБыть быстрее, чем другие предложения.
С другой стороны, если единственное совпадение b
ближе к концу таблицы, это должно будет сканировать почти весь индекс и работать медленнее, чем другие варианты.
a
должен быть первым в индексе.Имея оба столбца в индексе, он становится индексом «покрытия», следовательно, немного быстрее.
Это может быть тем, что использует мой SELECT
вместе с two индексов даст Оптимизатору достаточно, чтобы выбрать лучший подход:
INDEX(a,b)
INDEX(b,a)
Схема
Добавление одного (или обоих) составных индексов должно помочь.
Уменьшение размера таблицы может помочь ...
INT
занимает 4 байта.Подумайте, подойдет ли меньший тип данных для любого из этих столбцов. - Есть 3 даты (
DATETIME
, TIMESTAMP
);Вам все они нужны? - * *
fingerprint varchar(36)
UUID / GUID?Если это так, он может быть упакован в BINARY(16)
.
640MB плотно - проверьте графики, чтобы убедиться в отсутствии «замены».(Обмен был бы очень плох для производительности.)