终于看了一直景仰的
High Performance MySQL Second Edition一书,看了一些章节并把其中一些观点记录了下来,本文是整理 chapter 5. Advance MySQL features 部分观点所得。
1. 何时cachea) mysql query cache内容为 select 的结果集, cache 使用完整的 sql 字符串做 key, 并区分大小写,空格等。即两个sql必须完全一致才会导致cache命中。
b) prepared statement永远不会cache到结果,即使参数完全一样。据说在 5.1 之后会得到改善。
c) where条件中如包含了某些函数永远不会被cache, 比如current_date, now等。
d) date 之类的函数如果返回是以小时或天级别的,最好先算出来再传进去。
select * from foo where date1=current_date -- 不会被 cache
select * from foo where date1='2008-12-30' -- 被cache, 正确的做法
e) 太大的result set不会被cache (< query_cache_limit)
2. 何时invalidatea) 一旦表数据进行任何一行的修改,基于该表相关cache立即全部失效。
b) 为什么不做聪明一点判断修改的是否cache的内容?因为分析cache内容太复杂,服务器需要追求最大的性能。
3. 性能a) cache 未必所有场合总是会改善性能
当有大量的查询和大量的修改时,cache机制可能会造成性能下降。因为每次修改会导致系统去做cache失效操作,造成不小开销。
另外系统cache的访问由一个单一的全局锁来控制,这时候大量>的查询将被阻塞,直至锁释放。所以不要简单认为设置cache必定会带来性能提升。
b) 大result set不会被cache的开销
太大的result set不会被cache, 但mysql预先不知道result set的长度,所以只能等到reset set在cache添加到临界值 query_cache_limit 之后才会简单的把这个cache 丢弃。这并不是一个高效的操作。如果mysql status中Qcache_not_cached太大的话, 则可对潜在的大结果集的sql显式添加 SQL_NO_CACHE 的控制。
query_cache_min_res_unit = (query_cache_size – Qcache_free_memory) / Qcache_queries_in_cache
4. 内存池使用
mysql query cache 使用内存池技术,自己管理内存释放和分配,而不是通过操作系统。内存池使用的基本单位是变长的block, 一个result set的cache通过链表把这些block串起来。因为存放result set的时候并不知道这个resultset最终有多大。block最短长度为 query_cache_min_res_unit, resultset 的最后一个block会执行trim操作。
(引用:High Performance MySQL 原书Figure 5-1 插图)
定长:空间浪费
变长:需清理碎片
block 小: 链表超长,访问大块数据效率低。
另外发现 surfchen 的
MySQL的Query Cache 对这方面的内容描述也不错,可以和本文互为补充。
相关推荐
《High Performance MySQL (2004)》是MySQL领域的一本经典著作,专注于数据库的高性能优化和管理。这本书深入探讨了如何在实际应用中提升MySQL的性能,为开发者、DBA以及系统管理员提供了宝贵的指导。以下是一些核心...
9. **性能调优**:深入理解MySQL的配置选项,如innodb_buffer_pool_size、query_cache_size等,根据实际需求进行调优。此外,了解如何通过调整操作系统参数来提升MySQL性能。 10. **故障恢复与备份**:掌握MySQL的...
query_cache_min_res_unit has been exceeded, leading to increased performance.** 正确答案是 **A**。 - **解释:** 在高并发环境下,尽管Query Cache的命中率很高,但由于请求的数量增加,导致更多的查询需要...
MSQL 问题集合中关于 Query Cache(查询缓存)的讨论非常重要。在线上环境中,到底要不要开启 query cache 是一个需要仔细考虑的问题。 Query Cache 的优点是可以存储 SELECT 语句及其产生的数据结果,特别适用于...
"MySQL Performance Tuning Active Guide" 是一份旨在帮助用户提升MySQL数据库性能的指南,主要面向正在使用或计划优化MySQL性能的专业人士。 本指南可能涵盖以下关键知识点: 1. **SQL查询优化**:包括查询分析,...
3. **性能提升**:MySQL 5.7引入了性能优化器改进,如Query Cache的替代方案(Query Performance Improvement Framework,QPIF)和更好的查询分析,这些改进能够更准确地预测执行计划,从而提高查询速度。...
1. 数据库与表:MySQL中的数据库是一个逻辑存储单元,用于组织相关数据。表是数据库中的基本元素,由列和行构成,用来存储具体的数据。 2. 数据类型:MySQL支持多种数据类型,如整数类型(TINYINT、INT、BIGINT)、...
3. 监控数据库性能,使用工具如MySQL Performance Schema或Percona Toolkit进行诊断。 八、监控与调优工具 1. MySQL Monitor工具,如MySQL Workbench、phpMyAdmin等,帮助实时查看数据库状态。 2. 使用Percona ...
2. **增强的SQL查询性能**:引入了Query Cache改进,提升了查询缓存的效率。同时,查询优化器也得到了升级,可以更准确地评估查询计划,选择最优路径。 3. **JSON支持**:MySQL 5.7首次引入了原生JSON数据类型,...
- `query_cache_size`:查询缓存大小,但 MySQL 8.0 已移除此选项,5.7 中可酌情调整。 **3. 初始化数据库** 首次安装后,需要初始化数据库: ```bash sudo /usr/bin/mysql_secure_installation ``` 这将引导你...
2. **性能提升**:MySQL 5.7引入了Query Cache的替代品——Query Performance Infrastructure (QPI),虽然Query Cache在5.7中已被废弃,但QPI提供了更灵活的查询优化策略。此外,优化了并行复制,提升了读写性能。 ...
- **Performance Schema**:这是一个监控和分析MySQL服务器性能的工具,提供详细的资源使用情况和性能指标。 - **Full-Text Search改进**:全文搜索功能得到了优化,支持更多查询语法和更高效的索引。 - **分区表的...
7. **Performance Schema**:这是一个监控和分析MySQL服务器性能的工具,5.6版本中,Performance Schema进一步完善,提供了更多性能指标和诊断信息,帮助管理员更好地优化数据库性能。 8. **GTID(Global ...
2. **性能优化**:MySQL 5.7引入了Query Cache优化,允许更灵活的缓存策略,并提高了查询性能。新的optimizer_trace功能可以帮助开发者调试和优化查询。 3. **JSON支持**:MySQL 5.7增加了对JSON数据类型的支持,...
- **Query Cache改进**:虽然在5.7.5版本后移除了查询缓存,但引入了更高效的查询执行机制来补偿这一改变。 - **优化器改进**:包括更智能的查询计划选择,提高了查询执行效率。 2. **数据安全性**: - **增强的...
2. **性能提升**:MySQL 5.7.16引入了Query Cache的替代品——Query Performance Infrastructure (QPI),它可以提供更智能的查询缓存策略,并提升了查询执行速度。 3. **JSON支持**:5.7版开始支持内置的JSON数据...
# MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值64 # 假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件...
4. **Query Cache**:查询缓存的优化使得数据库能够更快地响应已解析和执行过的 SQL 查询,从而提高了整体性能。5.6.10 版本可能包含了对查询缓存策略的调整,以更好地适应不同工作负载。 5. **Partitioning ...