`

mysql Query Cache 优化

 
阅读更多

 

   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处理连接数据库8.0以上程序报错query_cache_size

    然而,当Mycat与MySQL 8.0及以上版本配合使用时,可能会遇到一些兼容性问题,其中“query_cache_size”报错就是典型的例子。 在MySQL 8.0中,查询缓存功能被默认禁用,并且在某些版本中被完全移除。这是由于MySQL...

    解决mycatJDBC8驱动连接Mycat1.6报错 Unknown system variable 'query_cache_size'

    这个问题出现的原因在于MySQL 8.0版本中移除了`query_cache`相关的系统变量和功能,因此在使用新版本的JDBC驱动去连接旧版Mycat(可能基于较早版本的MySQL)时,会因找不到这个变量而抛出错误。 首先,我们需要理解...

    MySQL高速缓存启动方法及参数详解(query_cache_size)

    会发现其变量have_query_cache的值是yes,MYSQL初学者很容易以为这个参数为YES就代表开启了查询缓存,实际上是不对的,该参数表示当前版本的MYSQL是否支持Query Cache,实际上是否开启查询缓存是看另外一个参数的值:...

    对于mysql的query_cache认识的误区

    如果空格是加在query之前,比如是在query的起始处加了空格,这样是丝毫不影响query cache的结果的,mysql认为这是一条query, 而如果空格是在query中,那会影响query cache的结果,mysql会认为是不同的query

    mysql参数及其优化

    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原理分析

    MySQL的Query Cache是一种用于优化数据库性能的机制,它主要针对`SELECT`查询,旨在减少对磁盘I/O的依赖,通过缓存查询结果来提高数据检索速度。在MySQL中,Query Cache的工作原理基于SQL语句的精确匹配。当一个`...

    mysql性能优化.pptx

    - **MySQL配置文件优化**:修改`my.cnf`文件,优化如`innodb_buffer_pool_size`、`query_cache_size`等关键设置。 - **第三方配置工具**:利用如MySQLTuner、pt-query-digest等工具进行自动化调优。 6. **服务器...

    mysql优化笔记+资料

    3. 调整query_cache_size,根据系统内存和查询特性设置合适的查询缓存大小。 六、硬件优化 1. 使用SSD硬盘代替HDD,提高I/O性能。 2. 根据数据库规模和访问模式,选择合适的CPU和内存配置。 3. 考虑使用RAID配置,...

    2G内存的MYSQL数据库服务器优化

    14. **query_cache_size=64M**:查询缓存的大小,用于缓存SELECT查询的结果。 - **建议值**:64M(根据查询频率和复杂度调整) #### 总结 对于2GB内存的MySQL服务器优化,需要综合考虑服务器的具体应用场景、...

    MySQL介绍和优化分享

    4. 服务器配置:调整MySQL的配置参数,如innodb_buffer_pool_size、max_connections、query_cache_size等,以适应不同的工作负载。 三、参数设置详解 1. innodb_buffer_pool_size:InnoDB存储引擎的缓存池大小,...

    MYSQL.rar_MYSQL_mysql 优化_mysql优化_mysql备份_sql优化

    3. 配置优化:调整MySQL服务器的配置参数,如innodb_buffer_pool_size、max_connections、query_cache_size等,以适应特定的工作负载。定期检查和调整这些设置,以保持数据库的最佳性能。 4. 硬件优化:考虑使用更...

    MSQL问题集合,线上环境到底要不要开启query cache

    MSQL 问题集合,线上环境到底要不要开启 query cache MSQL 问题集合中关于 Query Cache(查询缓存)的讨论非常重要。在线上环境中,到底要不要开启 query cache 是一个需要仔细考虑的问题。 Query Cache 的优点是...

    MySQL性能优化的最佳21条经验

    9. **使用缓存**:MySQL的Query Cache可以缓存SELECT结果,减少对数据库的访问。但需注意更新频繁的表可能不适合启用此功能。 10. **适当调整MySQL配置**:如增大innodb_buffer_pool_size,缓存更多数据和索引,...

    mysql基础知识和mysql优化整理

    4. 内存配置:调整缓冲池大小,提高内存利用率,例如增大InnoDB Buffer Pool,设置适当的Query Cache大小。 5. 事务与锁定:根据业务场景选择合适的事务隔离级别,理解行级锁定和表级锁定的区别,避免死锁。 6. ...

    mysql的sql优化

    通过调整innodb_buffer_pool_size、query_cache_size等参数,可以优化内存使用,提高数据库性能。定期分析和优化表结构(ANALYZE TABLE)和重建索引(OPTIMIZE TABLE)也有助于保持数据库的良好运行状态。 在实际...

    MySQL参数优化辅助工具

    在MySQL的运行过程中,有许多配置参数可以调整,如innodb_buffer_pool_size、max_connections、query_cache_size等,这些参数的合理设置能够显著提升查询速度、减少内存消耗和提高并发能力。然而,手动调整这些参数...

Global site tag (gtag.js) - Google Analytics