dresende / node-orm2

Object Relational Mapping
http://github.com/dresende/node-orm2
MIT License
3.07k stars 379 forks source link

SQL query optimisations #617

Open set-killer opened 9 years ago

set-killer commented 9 years ago

Hello guys, Lets, for example, see the current case. We have the following databases:

db.define('users', {
        id: Number,
        username: String,
        database: String
 });

db.define('address', {
        id: Number,
        user_id: Number,
        country: String,
        city: String,
        street: String
 });
db.models.address.hasOne('user', db.models.users, {reverse: 'addresses', autoFetch: true});

And now when i select ALL users it generates too many sql queries like this:

(orm/mysql) SELECT `id`, `username`, `database` FROM `users`
(orm/mysql) SELECT `id`, `user_id`, `country`, `city`, `street` FROM `address` WHERE `user_id` = 1
(orm/mysql) SELECT `id`, `user_id`, `country`, `city`, `street` FROM `address` WHERE `user_id` = 2
(orm/mysql) SELECT `id`, `user_id`, `country`, `city`, `street` FROM `address` WHERE `user_id` = 3
(orm/mysql) SELECT `id`, `user_id`, `country`, `city`, `street` FROM `address` WHERE `user_id` = 4
(orm/mysql) SELECT `id`, `user_id`, `country`, `city`, `street` FROM `address` WHERE `user_id` = 5
(orm/mysql) SELECT `id`, `user_id`, `country`, `city`, `street` FROM `address` WHERE `user_id` = 6

So basicly For every user in USERS creates a separate query from ADDRESS. Imagine if we have a milion users. This query will be soo slow.

Can this be optimized with 2 queries maybe like:

(orm/mysql) SELECT `id`, `username`, `database` FROM `users`
SELECT `id`, `user_id`, `country`, `city`, `street` FROM `address` 
WHERE `user_id` IN (1,2,3,4,5,6)

Or maybe with 1 query like:

SELECT `id`, `username`, `database` FROM `users`
LEFT JOIN `address` ON `address.user_id` = `users.id`

Thanks!