Что быстрее: file_get_contents к json файлу или запрос к бд?
вопрос абсолютно дебильный. и по содержанию, и по задаче.
скорость – в подавляющем кол-ве случаев вообще не является критерием.
критерий – удобство использования.

показываю на пальцах:
в десять раз быстрее. звучит круто, да?
а если взять не относительно, а абсолютно: насколько в разрезе вэба 0.001 секунды быстрее 0.01 секунды?
эту разницу вообще не заметить пока у вас не миллионы хитов хотя бы в час.

а если вам так уж уперлось получить ответ, то делайте замеры. потому что замеры других не имеют никакого отношения к вашим условиям.
Крч, если коротко, то в задачах, где происходит частое обращение к бд(ну я лично так думаю, не бейте), выгоднее использовать json файл.
Я использовал php функцию microtime, записывая в переменную ее значение вот так $time=microtime(true), первой строчкой в методе контроллера, далее выполнял код и самой последней строчкой ритернул return round(microtime(true) - $time, 4);, таким образом замеряя исполнение кода с округлением в 4 символа после запятой.
Вот пример всего кода в метода:
public function actionIndex()
    {
        $time = microtime(true);

        $user = User::findOne(['username' => 'www']);
        $user->username = 'www';
        $user->update();

        $json = json_decode(file_get_contents(__DIR__ ."/../../common/models/test.json"), true);
        $json['b'] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        file_put_contents(__DIR__ . "/../../common/models/test.json", json_encode($json));

        return round(microtime(true) - $time, 4);
    }
Как вы понимаете, либо обращение к бд, либо обращение к файлу было закомментировано.  Ну и для чистоты эксперимента я не просто получал данные из бд или файла, но и делал какую то обработку, селектил и менял значение поля модели, а потом делал updated(), либо менял значение объекта по ключу в файле. Так же стоит заметить, что при работе с файлом я использовал json_encode() и json_decode(), так как в реальной задаче вам вряд ли будет нужный чистый json.

Теперь к цифрам:
Среднее значение занимаемого времени при работе с бд, это - 0.850, а вот время исполнения получения и перезаписи файла зависит от его объема. Я судил не по кб, а по кол-ву символов в файле, так как IDE показывает это. И дело в том, что json файл с 1 млн символов, запись с декодом, смена какого то значения и потом перезапись с инкодом занимает в среднем 0.100. Другими словами 1 млн === 0.100.
Когда файл имел символов 200, то вся операция занимала в 100 процентах случаев 0.002.

Будут вопросы, пишите.