Queries, in the form of
statements, perform all the lookup operations in the database.
Tuning these statements is a top priority, whether to achieve
sub-second response times for dynamic web pages, or to chop
hours off the time to generate huge overnight reports.
SELECT statements, the tuning
techniques for queries also apply to constructs such as
CREATE TABLE...AS SELECT,
WHERE clauses in
DELETE statements. Those
statements have additional performance considerations because
they combine write operations with the read-oriented query
The main considerations for optimizing queries are:
Set up indexes on columns used in the
WHERE clause, to speed up evaluation,
filtering, and the final retrieval of results. To avoid
wasted disk space, construct a small set of indexes that
speed up many related queries used in your application.
Minimize the number of table scans in your queries, particularly for big tables.
Keep table statistics up to date, so the optimizer has the information needed to construct an efficient execution plan.
Learn the tuning techniques, indexing techniques, and
configuration parameters that are specific to the storage
engine for each table. Both
MyISAM have sets of guidelines
for enabling and sustaining high performance in queries.
Isolate and tune any part of the query, such as a function call, that takes excessive time. Remember that such a function might get called millions of times for a big query or insert operation.
Avoid transforming the query in ways that make it hard to understand, especially if the optimizer does some of the same transformations automatically.
If a performance issue is not easily solved by one of the
basic guidelines, investigate the internal details of the
specific query by reading the
EXPLAIN plan and adjusting
WHERE clauses, join
clauses, and so on. (When you reach a certain level of
expertise, reading the
EXPLAIN plan might be your
first step for every query.)
Adjust the size and properties of the memory areas that
MySQL uses for caching. With efficient use of the
InnoDB buffer pool,
MyISAM key cache, and the MySQL query
cache, repeated queries run faster because the results are
retrieved from memory the second and subsequent times.
Even for a query that runs fast using the cache memory areas, you might still optimize further so that they require less cache memory, making your application more scalable. Scalability means that your application can handle more simultaneous users, larger requests, and so on without experiencing a big drop in performance.
Deal with locking issues, where the speed of your query might be affected by other sessions accessing the tables at the same time.
In MySQL Cluster NDB 7.2 and later, the
NDB storage engine supports a join
pushdown optimization whereby a qualifying join is sent in its
entirety to MySQL Cluster data nodes, where it can be
distributed among them and executed in parallel. For more
information about this optimization, see
Conditions for NDB pushdown joins.