有没有办法告诉 MySQL 某些查询在缓存中具有更高的优先级,并且在数据变为无效之前不得弹出?
问题在于 innodb 缓存大小相当小,并且由于其他频繁使用的查询,“主要”重量级查询的数据很快就会弹出。
所以我们想说:“这些Major查询数据必须留在缓存中。如果缓存已满,则不会弹出任何Major数据,直到失效为止。如果缓存已满Major数据,则不会有其他查询使用缓存”。
一些信息: engine=InnoDB。缓存已打开,指令 SQL_(NO)_CACHE 未在应用程序查询中使用。缓存足够大以存储所有主要数据和许多“热”数据,但太小而无法存储所有查询数据的 5%。在所有查询上使用缓存是可取的,但它们不应该替换主要数据
首先,有两个与您的查询相关的缓存。
查询缓存使用
SQL_(NO)_CACHE
并且是不太重要的缓存。对于写入较多的生产系统,不妨关闭QC。 每次写入表都会刷新QC 中涉及的表的所有条目。这就引出了另一点:大型 QC 会导致大量冲洗活动。限制query_cache_size
在不超过50M左右。QC 可以帮助处理 CPU。buffer_pool是 InnoDB 的重要缓存。您应该将大约 70% 的 RAM 分配给
innodb_buffer_pool_size
. 这是缓存 InnoDB 数据块和索引的地方。它有帮助,因为它避免了很多 I/O。通常,最重要的事情是识别最慢的查询(使用
SHOW PROCESSLIST
和/或慢日志)并努力加快它们的速度。有时添加索引,有时对 SELECT 进行微小更改等,比调整缓存大小更能加快系统速度。buffer_pool 有一种方法可以避免表扫描耗尽缓存。QC 没有您要求的机制。
如果您确实保持 QC 开启,则设置
query_cache_type=DEMAND
并使用SQL_(NO)_CACHE
.