00:01 Let's explore this slightly updated version of our code. 00:04 Here we are in the github repository, 00:07 and I am in the source folder and I've added an 08_perf section, 00:10 and we have the starter_big_dealership and we have the big_dealership 00:15 it even has instructions here to tell you basically how to restore 00:17 that database we did just in the previous video. 00:20 This one is going to be a snapshot of how this chapter starts, 00:24 it's what we're starting from now and will remain that way; 00:27 here we're going to take basically a copy of that one 00:29 and evolve it into the fast high performance version, 00:33 so let's go over here and see what we've got. 00:35 Now, we have a few things that are slightly different, 00:38 the car is basically unchanged from before 00:41 although I added a little comment about how do we get to the owners. 00:45 The one thing that is new here, in terms of the model is this owner idea, 00:50 so cars can now have an owner 00:52 and how do we know which cars are owned by this owner 00:57 is we have a list of object ids, those object ids are the object ids of the cars 01:02 so we're going to push the ids of the cars that are owned here 01:06 I guess we could run it as a many to many or one to many relationship, 01:10 just depending on how we treat the owner, but theoretically, 01:13 we can have owners where there is a single car that is multiple owners 01:17 and there are owners that own multiple cars, and we can manage it this way, 01:21 you almost never see like a car to owner intermediate table, 01:25 so you're almost always going to have something like 01:27 those ids are either embedded in the owner or in the car, 01:32 or under rare circumstances both. 01:35 So here's how we refer back to the cars, 01:38 then we have a few basic things like the name, 01:41 when was this owner created, how many times have they visited and things like that. 01:45 We want to call it owners in the database and it's just this core collection, 01:49 so other than that, there's not a whole lot going on here, 01:51 let's look over here, we now have these services, 01:54 I've taken all the car queries and moved them down here 01:57 do you want to create a car, you call this function, 01:59 do you want to record a customer visit, here we can go to the owner 02:03 and we can use this increment operator 02:06 to increment the number of visits in place. 02:09 Find cars by make, find owner by name and so on. 02:16 Number of cars with bad service, a lot of this stuff is what we wrote previously; 02:20 there was the program thing that we ran over here that was interactive 02:23 and I've replaced that with a few things, 02:25 one is this db stats and you can run this and it will tell you 02:28 like how many cars are there, how many owners are there, 02:31 what's the average number of histories, 02:33 this is basically those stats that I presented to you before, 02:36 this takes a while to run on this database, I don't recommend you run it 02:39 but if you want to just run it and see what you get you can. 02:42 The database was originally created using this script, 02:46 I am using something interesting you may not have heard about, 02:49 I am using this thing called Faker, so down here 02:53 Faker lets you create this thing and I'm seeding it 02:59 so it always generates exactly the same things, 03:01 I'm seeding random and fake and you can see down here 03:04 it's creating the owners and you can ask it for things like 03:06 give me a fake name, give me a fake date 03:08 between these two dates, things like that. 03:12 Similarly with cars, we're using random to get a hold of a lot of the numbers 03:15 then we can use fake for anything else we might. 03:18 We ran this, with the right amount of data, it'll build it all up for us, 03:25 so for some reason if you need to recreate it 03:27 run this low data thing, you can have it create a small one, 03:30 if you comment, uncomment that or a large one 03:32 if you only run it with those settings. 03:34 Those are all good, this is like the foundation and this is where we are. 03:37 Next, we're going to ask interesting questions of this database 03:43 and we want to know how long those questions take to answer, 03:46 so I've written this super simple function called time 03:48 you pass it a message and a function, 03:50 it will time how long the function takes to run 03:53 and then print out the message along with the time in terms of milliseconds. 03:57 And then we're going to go through 03:59 and we're going to ask interesting questions here 04:01 like how many owners, how many cars, who is the 10 thousandth owner, 04:05 notice the slicing here to give us a slice of item of length one 04:10 and then we'll just access it, 04:12 and then we can start asking interesting questions like 04:14 how many cars are owned by the 10 thousandth owner, 04:17 or if we go down here, how many owners own the 10 thousandth car, 04:21 so ask it in the reverse direction. 04:23 Here we want to find the 50 thousand owner by name, 04:26 so yes, technically have them but the idea is 04:30 we want to do a query based on the name field 04:32 and we originally won't have any performance 04:35 around these types of queries so it should be slow. 04:38 This one, how many cars are there with expensive service 04:40 this was the one with the snail 04:43 and in one of the first videos in this chapter, 04:46 I showed you look this takes 700 milliseconds to run to ask this question 04:49 how many cars have a service history with a price greater than 16800. 04:55 So we're going to be to be able to ask all of these questions 04:58 and this program will let us explore that 05:02 and we'll see how to add indexes 05:04 and I'll show you how to add indexes in the shell 05:06 and how to add them in MongoEngine, and MongoEngine is really nice 05:09 because as you evolve your indexes, as you add new ones 05:13 simply deploying your Python web app 05:15 will adapt the database that it goes and finds 05:18 to automatically upgrade to those indexes, so it's really really nice. 05:22 So here you can see we're going to run this code and ask a bunch of questions 05:25 we could load the data from here, we could generate the data, 05:28 but you're much better off importing the data from that zip file 05:32 because this takes like half an hour to run, 05:35 you saw that zip takes like five seconds.