Skip to content

Version 5.3.0

Choose a tag to compare

@visavi visavi released this 05 Aug 23:07
· 6 commits to master since this release

Производительность

Поиск по ключу. 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 — поиск строки по первичному ключу