面试题答案
一键面试查询缓存误区及规避方法
- 误区
- 认为查询缓存总是有益:查询缓存对所有查询都缓存,包括动态查询。比如带有函数(如
NOW()
)、不确定结果(如RAND()
)的查询,即使缓存了也无法命中,还占用缓存空间。 - 缓存粒度问题:查询缓存以整个查询字符串为单位进行缓存,细微的差异(如空格、注释不同)都会导致缓存无法命中。例如
SELECT * FROM users;
和SELECT * FROM users;
(中间多了个空格)被视为不同查询。
- 认为查询缓存总是有益:查询缓存对所有查询都缓存,包括动态查询。比如带有函数(如
- 规避方法
- 避免缓存动态查询:对于包含函数、随机数等动态内容的查询,不依赖查询缓存。可以在应用层处理动态部分,如在PHP中先获取
NOW()
值再拼接SQL语句。 - 优化查询写法:确保查询语句规范统一,去除不必要的空格和注释,提高缓存命中率。例如统一使用
SELECT * FROM users;
这种规范写法。同时,可以使用预处理语句,避免因参数不同导致缓存无法命中。
- 避免缓存动态查询:对于包含函数、随机数等动态内容的查询,不依赖查询缓存。可以在应用层处理动态部分,如在PHP中先获取
InnoDB buffer pool误区及规避方法
- 误区
- 设置过小:认为服务器内存有限,不敢给
InnoDB buffer pool
分配足够内存。这会导致数据频繁从磁盘读取,增加I/O开销,降低性能。 - 不了解其工作原理:比如认为只要增大
InnoDB buffer pool
就能无限提升性能,忽略了其他因素。实际上,若内存分配过大,可能导致操作系统内存不足,引发交换空间(swap)使用,反而降低性能。
- 设置过小:认为服务器内存有限,不敢给
- 规避方法
- 合理分配内存:根据服务器内存和业务负载情况,合理设置
InnoDB buffer pool
大小。一般建议给InnoDB buffer pool
分配服务器物理内存的60% - 80%。例如,服务器有32GB内存,可以分配20GB - 25GB给InnoDB buffer pool
。 - 监控与调优:使用
SHOW ENGINE INNODB STATUS
命令监控InnoDB buffer pool
的使用情况,如命中率、脏页比例等。根据监控数据动态调整InnoDB buffer pool
大小及其他相关参数,如innodb_flush_method
等,以平衡磁盘I/O和内存使用。
- 合理分配内存:根据服务器内存和业务负载情况,合理设置