In writing a recommendation for our Web development team on how to use MySQL, I came up with the following list, which I want to share: What kind of queries are bad for MySQL?
- Any query is bad. Send a query only if you must. (Hint: use caching like memcache or redis)
- Queries that examine many rows are bad. Try instead to use…Shell1SELECT col1 FROM table1 WHERE primary_key_column=SOMETHING
. Or at leastShell1secondary_key_column=SOMETHING
. If it is still not possible, try to make the query examine the least amount of rows possible (zero is ideal, as we come to the first case here)
- Queries with JOINS are bad. Try to denormalize the table to avoid JOINS. Example: original queryShell1SELECT t2.value FROM t2 JOIN t1 ON (t1.id=t2.tid) WHERE t1.orderdate=NOW()
. This can be denormalized by copying the column orderdate from table t1 to table t2, so the query will look like:Shell1SELECT t2.value FROM t2 WHERE t2.orderdate=NOW()
. I know that fans of 3NF will hit me hard for this, but this is needed for performance
- Aggregation queries are bad. If you have SUM, AVG, MIN, MAX over many rows, try to pre-calculate these value in roll-up tables, or at least minimize amount of rows to handle. You can have daily, weekly, monthly, you name it, summary tables. Actually
INSERT .. ON DUPLICATE KEY UPDATE ...is very useful here.
Do you have more examples?