MySQL 的Query Cache 实现原理实际上并不是特别的复杂,简单的来说就是将客户端请求的Query语句(当然仅限于SELECT 类型的Query)通过一定的hash 算法进行一个计算而得到一个hash 值,存放在一个hash 桶中。同时将该Query 的结果集(Result Set)也存放在一个内存Cache 中的。存放Query hash 值的链表中的每一个hash 值所在的节点中同时还存放了该Query 所对应的Result Set 的Cache 所在的内存地址,以及该Query 所涉及到的所有Table 的标识等其他一些相关信息。系统接受到任何一个SELECT 类型的Query 的时候,首先计算出其hash 值,然后通过该hash 值到Query Cache 中去匹配,如果找到了完全相同的Query,则直接将之前所Cache 的Result Set 返回给客户端而完全不需要进行后面的任何步骤即可完成这次请求。而后端的任何一个表的任何一条数据发生变化之后,也会通知QueryCache,需要将所有与该Table 有关的Query 的Cache 全部失效,并释放出之前占用的内存地址,以便后面其他的Query 能够使用。
从上面的实现原理来看,Query Cache 确实是以比较简单的实现带来巨大性能收益的功能。但是很多人可能都忽略了使用QueryCache 之后所带来的负面影响:
a) Query 语句的hash 运算以及hash 查找资源消耗。当我们使用Query Cache 之后,每条SELECT类型的Query 在到达MySQL 之后,都需要进行一个hash 运算然后查找是否存在该Query 的Cache,虽然这个hash 运算的算法可能已经非常高效了,hash 查找的过程也已经足够的优化了,对于一条Query 来说消耗的资源确实是非常非常的少,但是当我们每秒都有上千甚至几千条Query 的时候,我们就不能对产生的CPU 的消耗完全忽视了。
b) Query Cache 的失效问题。如果我们的表变更比较频繁,则会造成Query Cache 的失效率非常高。这里的表变更不仅仅指表中数据的变更,还包括结构或者索引等的任何变更。也就是说我们每次缓存到Query Cache 中的Cache 数据可能在刚存入后很快就会因为表中的数据被改变而被清除,然后新的相同Query 进来之后无法使用到之前的Cache。
c) Query Cache 中缓存的是Result Set ,而不是数据页,也就是说,存在同一条记录被Cache 多次的可能性存在。从而造成内存资源的过渡消耗。当然,可能有人会说我们可以限定QueryCache 的大小啊。是的,我们确实可以限定Query Cache 的大小,但是这样,Query Cache 就很容易造成因为内存不足而被换出,造成命中率的下降。
对于Query Cache 的上面三个负面影响,如果单独拿出每一个影响来说都不会造成对整个系统多大的问题,并不会让大家对使用Query Cache 产生太多顾虑。但是,当综合这三个负面影响一起考虑的话,就必须重视了
相关推荐
然而,当Mycat与MySQL 8.0及以上版本配合使用时,可能会遇到一些兼容性问题,其中“query_cache_size”报错就是典型的例子。 在MySQL 8.0中,查询缓存功能被默认禁用,并且在某些版本中被完全移除。这是由于MySQL...
这个问题出现的原因在于MySQL 8.0版本中移除了`query_cache`相关的系统变量和功能,因此在使用新版本的JDBC驱动去连接旧版Mycat(可能基于较早版本的MySQL)时,会因找不到这个变量而抛出错误。 首先,我们需要理解...
会发现其变量have_query_cache的值是yes,MYSQL初学者很容易以为这个参数为YES就代表开启了查询缓存,实际上是不对的,该参数表示当前版本的MYSQL是否支持Query Cache,实际上是否开启查询缓存是看另外一个参数的值:...
如果空格是加在query之前,比如是在query的起始处加了空格,这样是丝毫不影响query cache的结果的,mysql认为这是一条query, 而如果空格是在query中,那会影响query cache的结果,mysql会认为是不同的query
query_cache_size、query_cache_type、innodb_buffer_pool_size、innodb_log_file_size、innodb_log_buffer_size、innodb_flush_logs_at_trx_commit、transaction_isolation、innodb_file_per_table、innodb_open_...
MySQL的Query Cache是一种用于优化数据库性能的机制,它主要针对`SELECT`查询,旨在减少对磁盘I/O的依赖,通过缓存查询结果来提高数据检索速度。在MySQL中,Query Cache的工作原理基于SQL语句的精确匹配。当一个`...
- **MySQL配置文件优化**:修改`my.cnf`文件,优化如`innodb_buffer_pool_size`、`query_cache_size`等关键设置。 - **第三方配置工具**:利用如MySQLTuner、pt-query-digest等工具进行自动化调优。 6. **服务器...
3. 调整query_cache_size,根据系统内存和查询特性设置合适的查询缓存大小。 六、硬件优化 1. 使用SSD硬盘代替HDD,提高I/O性能。 2. 根据数据库规模和访问模式,选择合适的CPU和内存配置。 3. 考虑使用RAID配置,...
14. **query_cache_size=64M**:查询缓存的大小,用于缓存SELECT查询的结果。 - **建议值**:64M(根据查询频率和复杂度调整) #### 总结 对于2GB内存的MySQL服务器优化,需要综合考虑服务器的具体应用场景、...
4. 服务器配置:调整MySQL的配置参数,如innodb_buffer_pool_size、max_connections、query_cache_size等,以适应不同的工作负载。 三、参数设置详解 1. innodb_buffer_pool_size:InnoDB存储引擎的缓存池大小,...
3. 配置优化:调整MySQL服务器的配置参数,如innodb_buffer_pool_size、max_connections、query_cache_size等,以适应特定的工作负载。定期检查和调整这些设置,以保持数据库的最佳性能。 4. 硬件优化:考虑使用更...
MSQL 问题集合,线上环境到底要不要开启 query cache MSQL 问题集合中关于 Query Cache(查询缓存)的讨论非常重要。在线上环境中,到底要不要开启 query cache 是一个需要仔细考虑的问题。 Query Cache 的优点是...
9. **使用缓存**:MySQL的Query Cache可以缓存SELECT结果,减少对数据库的访问。但需注意更新频繁的表可能不适合启用此功能。 10. **适当调整MySQL配置**:如增大innodb_buffer_pool_size,缓存更多数据和索引,...
4. 内存配置:调整缓冲池大小,提高内存利用率,例如增大InnoDB Buffer Pool,设置适当的Query Cache大小。 5. 事务与锁定:根据业务场景选择合适的事务隔离级别,理解行级锁定和表级锁定的区别,避免死锁。 6. ...
通过调整innodb_buffer_pool_size、query_cache_size等参数,可以优化内存使用,提高数据库性能。定期分析和优化表结构(ANALYZE TABLE)和重建索引(OPTIMIZE TABLE)也有助于保持数据库的良好运行状态。 在实际...
在MySQL的运行过程中,有许多配置参数可以调整,如innodb_buffer_pool_size、max_connections、query_cache_size等,这些参数的合理设置能够显著提升查询速度、减少内存消耗和提高并发能力。然而,手动调整这些参数...