Eloquent Performance Patterns
Learn how to drastically improve the performance of your Laravel applications by pushing more work to the database, all while still using the Eloquent ORM.
More
Performance issues suck. Customers are frustrated. Your servers are overloaded. Management is breathing down your neck.
You've already solved all your N+1 issues, added the necessary indexes, and you're even paying for the most expensive database server available. But despite all this, some things just feel impossible to build in a performant way.
We can't paginate results in the database because they depend on authorization checks that happen in Laravel.
We have to do some really complicated calculations on large data sets, which seems impossible without a real programming language like PHP.
We can't sort results in the database, because we have to sort by values computed in our application.
So you invest months into different caching strategies to try and speed things up, but caching is hard. Every time you think you've solved a performance problem, you have a new caching problem to deal with instead.
I've been there and it sucks. So one day I decided “that's it, I'm going to figure out how to push all this work to the database if it kills me.” The results blew my mind.
By leveraging advanced database techniques, like sub queries, conditional aggregates, and aggressive use of scopes, pages that took 30+ seconds to load were now loading within 500ms!!
I've since spoken about Eloquent and database performance at both Laracon Online and Laracon US, and have written in-depth articles on the topic.
Watch Online Eloquent Performance Patterns
# | Title | Duration |
---|---|---|
1 | Measuring your database performance | 04:43 |
2 | Minimizing memory usage by selecting only | 04:29 |
3 | Getting one record from has-many relationships | 09:44 |
4 | Creating dynamic relationships using sub queries | 06:10 |
5 | Calculating totals using conditional aggregates | 04:21 |
6 | Optimizing circular relationships | 04:25 |
7 | Setting up multi-column searching | 04:07 |
8 | Getting LIKE to use an index | 05:05 |
9 | Faster options than whereHas | 03:55 |
10 | When it makes sense to run additional queries | 03:08 |
11 | Using UNIONs to run queries independently | 07:58 |
12 | Fuzzier searching using regular expressions | 04:45 |
13 | Running authorization policies in the database | 06:04 |
14 | Faster ordering using compound indexes | 04:05 |
15 | Ordering by has-one relationships | 01:38 |
16 | Ordering by belongs-to relationships | 01:39 |
17 | Ordering by has-many relationships | 04:21 |
18 | Ordering by belongs-to-many relationships | 05:39 |
19 | Ordering with NULLs always last | 07:36 |
20 | Ordering by custom algorithms | 06:38 |
21 | Filtering and sorting anniversary dates | 07:04 |
22 | Making N+1 issues impossible | 03:24 |
23 | Ordering data for humans using natural sort | 04:20 |
24 | Full text searching with rankings | 05:07 |
25 | Getting the distance between geographic points | 03:23 |
26 | Filtering by geographic distance | 03:00 |
27 | Ordering by geographic distance | 01:26 |
28 | Filtering by geospatial area | 04:36 |