Repository navigation
Version 5.3.0
Производительность
Поиск по ключу. find() больше не читает всю таблицу. Ключи в файле
идут по возрастанию, поэтому нужную строку находит двоичный поиск. На
50 000 строк запись из конца файла находится за 2.1 мс вместо 73.6.
Отсортированности файла никто не требует: если он отсортирован иначе или
повреждён, find() читает таблицу построчно, как раньше, и отдаёт тот же
ответ. Условия, сортировка или смещение перед find() тоже возвращают
обычное чтение.
Article::query()->find(1); // двоичный поиск
Article::query()->where('name', 'Миша')->find(1); // обычное чтение
Подсчёт строк. count() без условий больше не разбирает строки, а
только считает их. На 50 000 строк 54.5 → 7.3 мс, paginate(10)
55.1 → 7.8 мс; на 500 000 строк 551 → 64 мс. Счёт с условиями не
изменился — ему нужны значения.
Открытие файла. Запрос открывает таблицу один раз вместо двух: имена
колонок берутся из уже открытого файла. Чтение десяти строк 0.083 → 0.061 мс.
Добавлено
- CsvFile::countRows() — сколько строк в файле, без их разбора
- CsvFile::rowFrom() — первая целая строка, начинающаяся с байта или после
- CsvFile::startsRecord() — начинается ли запись с байта
- CsvFile::tell(), CsvFile::size() — позиция и размер файла
- Table::countRecords() — сколько строк в таблице, без заголовка
- Table::headersFrom() — имена колонок из уже открытого файла
- KeySearch — поиск строки по первичному ключу