ORM or SQL? A Better Way to Query in MySQL

25
ORM OR SQL? A BETTER WAY TO QUERY IN MYSQL Matthew Barlocker Lucid Software Inc

description

The problem with frameworks and ORMs is the lackadaisical manner with which they write queries. Their focus is to straddle multiple database engines, not to write queries in the optimal way. The database layer is always the hardest layer to scale. Why would you put additional strain on your database to avoid writing SQL? This session focuses on understanding indices, queries, and optimization in MySQL.

Transcript of ORM or SQL? A Better Way to Query in MySQL

Page 1: ORM or SQL? A Better Way to Query in MySQL

ORM OR SQL?A BETTER WAY TO QUERY IN MYSQL

Matthew Barlocker

Lucid Software Inc

Page 2: ORM or SQL? A Better Way to Query in MySQL

ABOUT “THE BARLOCKER”

• Chief Architect at Lucid Software Inc

• Bachelors degree from BYU in Computer Science

• I love to

• play board games

• go 4-wheeling

• wrestle my sons

• fly airplanes

• Follow me on nineofclouds.blogspot.com

Page 3: ORM or SQL? A Better Way to Query in MySQL

THE DATABASE LAYER

Page 4: ORM or SQL? A Better Way to Query in MySQL

SCALING DATABASES IS HARD

Start with a single

server

Develop features

rapidly

Low operational cost

No redundancy

Page 5: ORM or SQL? A Better Way to Query in MySQL

SCALING DATABASES IS HARD

Split database from

application layer

Add more application

servers

Start load balancing

traffic

Page 6: ORM or SQL? A Better Way to Query in MySQL

SCALING DATABASES IS HARD

Add a hot backup of

the database

Add more application

servers

Page 7: ORM or SQL? A Better Way to Query in MySQL

SCALING DATABASES IS HARD

Start doing reads on

the slave

Add a caching layer

Add more application

servers

Page 8: ORM or SQL? A Better Way to Query in MySQL

SCALING DATABASES IS HARD

Scale Vertically Scale Horizontally

Page 9: ORM or SQL? A Better Way to Query in MySQL

SCALING DATABASES IS HARD

Scale Vertically Scale Horizontally

Page 10: ORM or SQL? A Better Way to Query in MySQL

SCALING DATABASES IS HARD

Scale Vertically Scale Horizontally

Page 11: ORM or SQL? A Better Way to Query in MySQL

PROTECTING YOUR DATABASE

Page 12: ORM or SQL? A Better Way to Query in MySQL

WHEN IT COMES TO QUERIES…

FRAMEWORKS ARE YOUR ENEMIES

Page 13: ORM or SQL? A Better Way to Query in MySQL

FRAMEWORKS HATE WHEN YOU SLEEP

Page 14: ORM or SQL? A Better Way to Query in MySQL

FRAMEWORKS CREATE SIDE EFFECTS

Extra Joins

Wrong Kind of Joins

Default Ordering

Empty Array turned

into “IS NULL”

Page 15: ORM or SQL? A Better Way to Query in MySQL

FRAMEWORKS HAVE OTHER GOALS

Make it easy to create a website for novices

Make it easy to access your data

Support all databases (by making an abstraction

layer for data persistence)

Page 16: ORM or SQL? A Better Way to Query in MySQL

WHAT IS SQL?

Page 17: ORM or SQL? A Better Way to Query in MySQL

SQL IS AN ABSTRACTION

FOR DATA PERSISTENCE

Page 18: ORM or SQL? A Better Way to Query in MySQL

MYSQL OPTIMIZATIONS

Page 19: ORM or SQL? A Better Way to Query in MySQL

EXPLAIN HELPS WITH OPTIMIZATION

The select_type will vary based on what your

query is. SIMPLE is the best type.

The optimizer will select from possible_keys the

best key to index on. It’s choice will be in key.

If possible_keys is NULL, a full table scan will be

performed.

The rows column will give the estimated number

of rows to check, using the selected index.

EXPLAIN SELECT * FROM mytable;

http://dev.mysql.com/doc/refman/5.6/en/select-optimization.html

Page 20: ORM or SQL? A Better Way to Query in MySQL

SIMPLE QUERIES ARE… SIMPLE

INSERT INTO (…) VALUES (…);

UPDATE … WHERE indexedfield = 5;

DELETE … WHERE indexedfield = 5;

SELECT * FROM … WHERE indexedfield = 5;

Page 21: ORM or SQL? A Better Way to Query in MySQL

COMPLEX INDICES FIX SLOWNESS

Complex indices can fix file sorts and temporary

tables (from the explain statement)

A complex index contains multiple fields, in a

particular order.

The left-most prefix index can be used on its own.

SELECT * FROM t1 ORDER BY keypart1,

keypart2;

SELECT * FROM t1 WHERE keypart1 <

constant ORDER BY keypart1 DESC;

SELECT kp1, kp2 FROM t1 GROUP BY kp1,

kp2;

Page 22: ORM or SQL? A Better Way to Query in MySQL

COVERED INDICES ARE THE FASTEST

A covered index prevents a query from getting

rows from the disk.

Covered indices will have “Using Index” in the

explain output.

SELECT kp1, kp2 FROM t1 WHERE kp1 IS

NOT NULL;

SELECT MAX(kp1) FROM t1;

Page 23: ORM or SQL? A Better Way to Query in MySQL

JOINS ARE BAD

Joins require temporary table space and join

buffer.

Temporary (joined) tables don’t have indices.

Joins don’t always work in a sharded

environment.

Joins are less likely to be in the query cache.

Page 24: ORM or SQL? A Better Way to Query in MySQL

THANKS FOR YOUR TIME

Any Questions?

Page 25: ORM or SQL? A Better Way to Query in MySQL

JO

INT

HE

TE

AM

• Building the

next

generation of

collaborative

web

applications

• VC funded

• High growth

rate

• Profitable

• Graduates

from Harvard,

MIT, Stanford

• Former

Google,

Amazon,

Microsoft

employees

https://www.golucid.co/jobs