Laravel query performance – toBase

I’ve scoured many of the top results for “Laravel performance” in google, bing, duck duck go, etc… and am flummoxed that one of the key things to help boost Laravel performance is almost never mentioned. Specifically, I’m talking about the toBase() method in the query builder.

The toBase() method will instruct the query builder to skip the step of turning the query results in to full blown Eloquent objects, and instead, return standard PHP classes – the ‘stdClass’.

The resulting objects are bare. You can’t call any methods on them, because there are none to call.

Client::query()->where('owner_id', 7)->get();

let’s say this returns 70 client records. Each of those needs to be instantiated in to an Eloquent object. If you *need* that functionality – for example, you’re going to loop through this client list and call some operation on each client (sending a notification, or attaching resources, or whatnot..) the full Eloquent objects may be needed.

More often than not, however, I’ll see

$clients = Client::query()->where('owner_id',7)->get();
return response()->json(['clients'=>$clients);

You’ve just iterated through 70 records, created new Eloquent objects, then immediately set about converting them to JSON.

toBase() saves a tremendous amount of CPU time in the case above

$clients = Client::toBase()->query()->where('owner_id',7)->get();
return response()->json(['clients'=>$clients);

I’m not going to give full detailed benchmarks here – you can simply try this out for yourself.

I can say that with a minimally complex ‘Client’ object and about 600 records in the database:

$c = Client::query()->toBase()->get();

is roughly twice as fast as

$c = Client::query()->get(); 

A 50% speed up is nothing to sneeze at.

I recently took an API endpoint having to do with retrieving client records and associated addresses. With a little bit of rewriting – including toBase() – this went from 1.1 seconds down to ~200ms. This gets called multiple times per minute at heavy times, and having faster response times for the end users has been duly appreciated.

I believe this can be achieved in Doctrine with “HYDRATE_ARRAY” mode, and likely similar in other tech stacks (hibernate, etc).

Similar Posts

  • Identity and habits

    “Your present identity should not constrain your future habits”. For this quote from the audio book “Hello, Habits“. Obviously the book is about ‘habits’, but the phrase could easily have been “Your present identity should not constrain your future self”. In either reading of this, it’s been stuck in my head for while now.  How…

  • Open Source TechFinder

    Inspired by the AUTM conference, I got inspired to look at some of the common processes techtransfer folks do. Main idea was to try to develop something relatively ‘standalone’ that might address a use case I learned about, so I decided on building a web-based open source techfinder tool to publish licensable technologies. The notion…

  • k as in knife

    Many moons ago my earlier version of my blog had this list I use when spelling things for people over the phone. I managed to find it at archive.org and thought I’d repost… a as in aisle (or aye) b as in bdellium  c as in czar d as in djibouti e as in eight…

  • Onboarding freelancers

    Maari Casey over at uncompany had a recent LinkedIn post about planning for freelancers. She made some good points, but I think skipped one, and it’s not just relevant for freelancers. Even well before an organization might need extra work – be it freelance or employee – companies need to have a plan for onboarding….

  • laravel bulk imports

    Small note, mostly for myself, as a reminder that when doing large imports of data, you may not need each block to be processed as an Eloquent model. That code above would generally be faster as Obviously there are even faster ways – preparing your data in some text format, and using your DB cli…

  • MySQL speed boost

    I hit a problem the other day with concurrent queries causing deadlocks.  Using innodb gives you a lot of protection with respect to transaction support, but it carries a moderate amount of overhead, and unless you’re aware of what’s going on, you may be paying a higher price which can eventually cause performance or deadlock…

Leave a Reply

Your email address will not be published. Required fields are marked *