top | item 1448744

Nginx directly to mysql. 3 - 4 times as fast as php + libmysql

98 points| base | 16 years ago |nginx.org | reply

43 comments

order
[+] CWIZO|16 years ago|reply
This has maintainability problems written all over it. I can't imagine a web page where you would actually gain something from this, that wouldn't be complex enough that you wouldn't need some language to deal with more complex selects/inserts. And that would mean that you would spread your logic (models?) across two totally different "platforms". One part in nginx conf file (brrr) and the other in your code. Add something like Sphinx into the mix, and you have your SQL all over the place.
[+] rbranson|16 years ago|reply
In other news, computer scientists discover that evented C code is faster than PHP.
[+] kingkilr|16 years ago|reply
This was promptly followed by 6 hours of pedants complaining that that isn't really computer science, but actually software engineering.
[+] IgorPartola|16 years ago|reply
Why is it only 3-4 times faster is what surprises me. No question that cutting out the PHP interpreter and VM is going to speed things up, but only ever so slightly?
[+] ww520|16 years ago|reply
The speed of MySQL is constant in both cases, and IO is always expensive, thus the CPU speedup via C vs PHP is not as dramatic as one hopes; remove MySQL from the equation and you'll see the gigantic difference.
[+] piotrSikora|16 years ago|reply
Because it's taken out of the context. Original text says:

"We even observed that ngx_drizzle + ngx_rds_json achieved 128MB/sec (Yes, 1024Mbit/sec!) for a 380KB data-set query while connecting to a simple mysql server, about 3 ~ 4 times as fast as php + libmysql in this setting."

As you can imagine in such scenario (380KB result), MySQL engine is taking the most of the time.

[+] earle|16 years ago|reply
Why is this a surprise to anyone? And Nginx to memcache will be even faster... and serving static content even faster...

You're adding a tremendous amount of overhead with any high level language stuck in between the connect and the data source.

This is about as basic as it gets, not worthy of #1 item on hacker news.

[+] regularfry|16 years ago|reply
The idea that you might not need the high-level language in the middle at all is interesting in itself. At least, it is to me. I've not seen it before.
[+] buro9|16 years ago|reply
You're kidding me right? I'm off to re-write my entire app as a stored proc ;)

You are right of course. But what would be nice would be to replace part of a static page with the result of a piece of SQL. To combine ESIs with MySql so that you can serve static files and still be able to add things like watermarks using a MySql lookup based on a session cookie.

[+] orlandu63|16 years ago|reply
I'd like to see a benchmark against PHP + mysqlnd (native mysql driver for PHP, which supersedes libmysql as of PHP 5.3)
[+] jolan|16 years ago|reply
Ditto, plus another round using facebook's hip hop php compiler.
[+] Lorin|16 years ago|reply
This keeps reminding me to get off my butt and make some sort of passthrough between nginx and mongodb. Yes, I know there's GridFS development but it doesn't suit my needs.
[+] dylanz|16 years ago|reply
The title of this post is a bit misleading. It's agentzh (who rocks) announcing two new plugins which have plenty of use-cases.
[+] piotrSikora|16 years ago|reply
Yes, title is definitely misleading. He's not even announcing new modules (both are available for about half year now), he just announced massive performance boost in them.
[+] defied|16 years ago|reply
This should really speed up my website's autocompletion. Not having to load the rails stack will be a big performance boost.
[+] cdine|16 years ago|reply
So, I get it and all that, what are some real world use cases of this and the postgresql equivalent? Who's actually using these things for something other than saying how fast they are?

I just hope they aren't being used as public-facing JSON API endpoints and the such, since none of them seem to even consider the case of SQL injection. From a quick glance it doesn't seem that any type of parameterized query or prepared statements are available to even begin helping with that, and the "documentation" examples wouldn't be setting people off on the right foot by even limiting the location paths with strict regex's.

[+] piotrSikora|16 years ago|reply
> Who's actually using these things for something other than saying how fast they are?

Taobao.com (14th biggest site in the world, 3rd in China - according to Alexa) is using ngx_drizzle + ngx_rds_json in production. Qunar.com is using ngx_postgres + ngx_rds_json.

[+] jbeluch|16 years ago|reply
The example seems to use both regex and set_quote_sql_str to prevent sql injection.
[+] xhuang|16 years ago|reply
removing high level language in the middle is good, if you need performance, why not just use redis to server json directly, in the case you need scale up your db why not use crunchDB.
[+] llimllib|16 years ago|reply
What is the code in this app written in, I don't really follow?
[+] turtle4|16 years ago|reply
You specify a route in the nginx config, and when the route is requested, it serves up the result of the sql query that you specified. Even further, it looks like it will run different queries, depending on the type of request made (GET, PUT, DELETE).

This just makes it a little easier to put together a RESTful app. Alot of those apps are just thin wrappers around the request that check the request type, check authentication, and then perform a simple db statement. This is easier to define, and apparently alot faster.

[+] apgwoz|16 years ago|reply
It seems as though you write the SQL in the nginx conf... Not sure if it's then somehow available elsewhere.
[+] executive|16 years ago|reply
can this be used with PHP though?
[+] spooneybarger|16 years ago|reply
the entire point is to remove php/perl/ruby etc from the equation.