How to configure the MySQL query cache for performance?
Aug 03, 2025 am 04:33 AMFirst, confirm that the MySQL version supports query cache (only supported by 5.7 and earlier), and check have_query_cache, query_cache_type and query_cache_size through SHOW VARIABLES to ensure that they are available and enabled; 2. Set query_cache_size reasonably, and it is recommended that the OLTP system use 64MB to 256MB to avoid memory fragmentation or contention due to excessive size; 3. Use query_cache_type = 2 (DEMAND mode), and only cache high-frequency queries that clearly mark SQL_CACHE to avoid resource waste; 4. Adjust query_cache_min_res_unit to reduce fragmentation, monitor Qcache_free_blocks to evaluate fragmentation, and execute FLUSH QUERY if necessary CACHE organizes memory; 5. Understand the limitations of query cache, including lock contention under high concurrency, cache failure caused by table writes, precise matching requirements, etc. If Qcache_lowmem_prunes is too high or the system writes more and reads less, query cache should be considered; it is finally recommended to configure query_cache_type = 2, query_cache_size = 128M, query_cache_min_res_unit = 1024, and combine the ratio between Qcache_hits and Qcache_inserts to evaluate efficiency, and give priority to more efficient performance improvement solutions such as application layer caching or index optimization.
MySQL's query cache can improve performance by storing the text of a SELECT statement along with the result set. If an identical query is received later, MySQL returns the cached result without executing the query again. However, proper configuration is essential to get benefits without causing overhead or memory contention.

Here's how to configure the MySQL query cache effectively for performance:
1. Check if Query Cache is Available and Enabled
First, verify that your MySQL version supports the query cache. Note that MySQL 8.0 removed the query cache entirely , so this only applies to versions 5.7 and earlier.

Run:
SHOW VARIABLES LIKE 'have_query_cache';
If the value is YES
, query cache is available.

Check current status:
SHOW VARIABLES LIKE 'query_cache_type'; SHOW VARIABLES LIKE 'query_cache_size';
Ensure query_cache_type
is set to ON
(or 1
) to enable caching.
2. Set the Query Cache Size Appropriately
The query_cache_size
system variable controls how much memory is allocated for cached queries.
Example (in my.cnf
or my.ini
):
query_cache_size = 256M
Important considerations:
- Too small (eg, 0 or 1M): No real benefit.
- Too large (eg, >1G): Can cause memory fragmentation and mutex content, especially under high concurrency.
- Recommended range: 64MB to 256MB for most OLTP systems.
After setting, monitor the actual usage:
SHOW STATUS LIKE 'Qcache%';
Key metrics:
-
Qcache_hits
: Number of cache hits. -
Qcache_inserts
: Number of queries added to the cache. -
Qcache_lowmem_prunes
: Number of times entries were removed due to memory shortage.
If Qcache_lowmem_prunes
is high and growing fast, either increase the size or reevaluate usefulness.
3. Control What Gets Cached
Use query_cache_type
to define caching behavior:
-
0
orOFF
: No caching. -
1
orON
: Cache all SELECTs except those marked withSQL_NO_CACHE
. -
2
orDEMAND
: Only cache queries explicitly marked withSQL_CACHE
.
For better control, use:
query_cache_type = 2
Then explicitly cache only known, frequently used, expensive queries:
SELECT SQL_CACHE * FROM reports WHERE month = '2024-01';
This avoids wasting memory on one-time or infrequency queries.
4. Tune Query Cache Fragmentation and Cleanup
Over time, the cache can become fragmented, reducing efficiency.
Key variables:
query_cache_min_res_unit = 512
- This sets the minimum allocation unit for each query result.
- If you have many small queries, lower this (eg, 256 or 512 bytes).
- If you have large result sets, increase it (eg, 2K or 4K) to reduce fragmentation.
Monitor fragmentation:
SHOW STATUS LIKE 'Qcache_free_blocks';
A high number of free blocks relative to total cache size indicates fragmentation.
To defragment (if needed):
FLUSH QUERY CACHE;
(This doesn't clear data but reorganizes memory.)
Avoid RESET QUERY CACHE
unless necessary—it clears all entries.
5. Understand the Limitations and Trade-offs
The query cache has known limitations:
- It's per-connection mutex locked , so under high concurrency, it can become a bottleneck.
- Any write to a table invalidates all cached queries that involve that table.
- It only works for exact text matches—whitespace or comments make queries different.
- Not useful in write-heavy workloads.
Because of these, even with tuning, the query cache may not help (or can hurt) performance in many real-world scenarios.
Summary: Recommended Configuration (for MySQL 5.7 and earlier)
query_cache_type = 2 query_cache_size = 128M query_cache_min_res_unit = 1024
And use SQL_CACHE
only on stable, frequently executed, read-heavy queries.
Also:
- Monitor
Qcache_hits / (Qcache_hits Qcache_inserts)
to gauge efficiency. - Consider disabling the query cache (
query_cache_type = OFF
,query_cache_size = 0
) if you're on a busy OLTP system or using MySQL 5.7 with high concurrency.
Keep in mind: For modern applications, application-level caching (eg, Redis, Memcached) or index optimization often provides better and more scalable performance than the MySQL query cache.
Basically, configure it carefully if you must use it—but don't rely on it as a primary performance fix.
The above is the detailed content of How to configure the MySQL query cache for performance?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

TosecurelyconnecttoaremoteMySQLserver,useSSHtunneling,configureMySQLforremoteaccess,setfirewallrules,andconsiderSSLencryption.First,establishanSSHtunnelwithssh-L3307:localhost:3306user@remote-server-Nandconnectviamysql-h127.0.0.1-P3307.Second,editMyS

Turn on MySQL slow query logs and analyze locationable performance issues. 1. Edit the configuration file or dynamically set slow_query_log and long_query_time; 2. The log contains key fields such as Query_time, Lock_time, Rows_examined to assist in judging efficiency bottlenecks; 3. Use mysqldumpslow or pt-query-digest tools to efficiently analyze logs; 4. Optimization suggestions include adding indexes, avoiding SELECT*, splitting complex queries, etc. For example, adding an index to user_id can significantly reduce the number of scanned rows and improve query efficiency.

When handling NULL values ??in MySQL, please note: 1. When designing the table, the key fields are set to NOTNULL, and optional fields are allowed NULL; 2. ISNULL or ISNOTNULL must be used with = or !=; 3. IFNULL or COALESCE functions can be used to replace the display default values; 4. Be cautious when using NULL values ??directly when inserting or updating, and pay attention to the data source and ORM framework processing methods. NULL represents an unknown value and does not equal any value, including itself. Therefore, be careful when querying, counting, and connecting tables to avoid missing data or logical errors. Rational use of functions and constraints can effectively reduce interference caused by NULL.

mysqldump is a common tool for performing logical backups of MySQL databases. It generates SQL files containing CREATE and INSERT statements to rebuild the database. 1. It does not back up the original file, but converts the database structure and content into portable SQL commands; 2. It is suitable for small databases or selective recovery, and is not suitable for fast recovery of TB-level data; 3. Common options include --single-transaction, --databases, --all-databases, --routines, etc.; 4. Use mysql command to import during recovery, and can turn off foreign key checks to improve speed; 5. It is recommended to test backup regularly, use compression, and automatic adjustment.

To view the size of the MySQL database and table, you can query the information_schema directly or use the command line tool. 1. Check the entire database size: Execute the SQL statement SELECTtable_schemaAS'Database',SUM(data_length index_length)/1024/1024AS'Size(MB)'FROMinformation_schema.tablesGROUPBYtable_schema; you can get the total size of all databases, or add WHERE conditions to limit the specific database; 2. Check the single table size: use SELECTta

Character set and sorting rules issues are common when cross-platform migration or multi-person development, resulting in garbled code or inconsistent query. There are three core solutions: First, check and unify the character set of database, table, and fields to utf8mb4, view through SHOWCREATEDATABASE/TABLE, and modify it with ALTER statement; second, specify the utf8mb4 character set when the client connects, and set it in connection parameters or execute SETNAMES; third, select the sorting rules reasonably, and recommend using utf8mb4_unicode_ci to ensure the accuracy of comparison and sorting, and specify or modify it through ALTER when building the library and table.

GROUPBY is used to group data by field and perform aggregation operations, and HAVING is used to filter the results after grouping. For example, using GROUPBYcustomer_id can calculate the total consumption amount of each customer; using HAVING can filter out customers with a total consumption of more than 1,000. The non-aggregated fields after SELECT must appear in GROUPBY, and HAVING can be conditionally filtered using an alias or original expressions. Common techniques include counting the number of each group, grouping multiple fields, and filtering with multiple conditions.

MySQL supports transaction processing, and uses the InnoDB storage engine to ensure data consistency and integrity. 1. Transactions are a set of SQL operations, either all succeed or all fail to roll back; 2. ACID attributes include atomicity, consistency, isolation and persistence; 3. The statements that manually control transactions are STARTTRANSACTION, COMMIT and ROLLBACK; 4. The four isolation levels include read not committed, read submitted, repeatable read and serialization; 5. Use transactions correctly to avoid long-term operation, turn off automatic commits, and reasonably handle locks and exceptions. Through these mechanisms, MySQL can achieve high reliability and concurrent control.
