Maison >base de données >tutoriel mysql >Vous faire comprendre le pool de tampons de base de données (Buffer Pool) dans MySQL
Pour les tables utilisant le moteur de stockage InnoDB, l'espace de stockage est géré en unités de pages, comme granularité de base pour les échanges entrants et sortants entre la mémoire et le disque. Lorsque nous chargeons une page du disque dans la mémoire, des E/S sur le disque seront effectuées. La surcharge des E/S disque affecte grandement les performances globales. Si nous lisons la page correspondante directement à partir de la mémoire, cela ne réduirait-il pas la perte de performances causée par les E/S disque et l'efficacité serait considérablement améliorée. Sur cette base, Buffer Pool (
Buffer Pool
) est apparu, alors parlons ensuite de Buffer Pool dans InnoDB.Buffer Pool
) 出现了,那么接下来,我们就来谈谈InnoDB中的Buffer Pool。
有人会想,既然缓冲池这么好,那我们将所有数据都存储到缓冲池中不就好了,不不不,缓冲池是操作系统分配的一片连续的内存。而内存相比于磁盘的容量小得多,并且价格昂贵。那么操作系统会给缓冲池分配多少内存呢?
当然,如果你的机器的内存容量非常大,可以在配置文件中配置启动选项参数innodb_buffer_pool_size
单位是字节,最小不能小于5MB。
缓冲池将操作系统分配的这一片连续的内存,划分成若干个大小默认为16KB的页(缓冲页)【此时还没有真正的磁盘页被缓存到Buffer Pool中】,当我们从磁盘中换入一个页到缓冲池中,如何分配位置呢?因此就需要一些控制信息来标识这些缓冲池中的缓冲页,这些控制信息都存放在一个叫控制块的内存区域中,与缓冲页一一对应。控制块的大小也是固定的。因此在这片连续的内存空间中,难免会产生内存碎片。综上,缓冲池的内部结构如下:
上面在控制块中提到了链表节点信息,那么链表节点是用来做什么的呢?是为了更好的管理缓冲池中的页。而链表就是用来链接控制块的,因为控制块与缓冲页是一一对应的。
将所有空闲的缓冲页对应的控制块链接起来,形成的链表。
解决的问题:从磁盘中换入一个页到缓冲池中,如何区分缓冲池中的哪个页是空闲的呢?而有了空闲链表之后,换入一个磁盘页到缓冲池中时,就直接从空闲链表中获取一个空闲的缓冲页,并将磁盘页中对应的信息填到缓冲页对应的控制块中,然后将该控制块从空闲链表中删除即可。
若修改了缓冲池中的缓冲页的数据,导致其与磁盘中数据不一致,该页称为脏页。将所有脏页对应的控制块链接起来形成更新链表,在将来的某个时间根据该链表将对应缓存页的数据刷新到磁盘中。
缓冲池的大小是有限的,如果缓存的页超出了缓冲池的大小,即没有空闲的缓冲页了,当有新的页要添加到缓冲池中时,采取LRU的策略将旧的缓冲页从缓冲池中移除,然后将新的页添加进来。由于LRU链表涉及的内容较多,我们接下来单独介绍。
在I/O上的优化机制,预读顾名思义,会异步地把某些页面加载到缓冲池中,预计很快就会需要这些页面,这些请求在一个范围内引入所有页面,就是所谓的 局部性原理
,目的是减少磁盘I/O。
了解预读机制之前,先回顾一下InnoDB逻辑存储单元:表空间(tablespace)→段(segment )→区(extent)→页(page)。其中特意提一下区,后面会用到:一个区就是物理位置上连续的64个页
Le pool de mémoire tampon est une mémoire contiguë allouée par le système d'exploitation. La mémoire a une capacité bien inférieure à celle du disque et coûte cher. Alors, quelle quantité de mémoire le système d’exploitation allouera-t-il au pool de mémoire tampon ?
innodb_buffer_pool_size
L'unité est de octets, et le minimum ne peut pas être inférieur à 5 Mo.
Principe de localité
Le but est de réduire les E/S disque. 🎜🎜Avant de comprendre le mécanisme de lecture anticipée, passons en revue l'unité de stockage logique InnoDB : tablespace → segment → étendue → page. Les zones sont spécifiquement mentionnées, qui seront utilisées plus tard : une zone est un 64 pages
continu dans un emplacement physique, c'est-à-dire que la taille d'une zone est de 1 Mo.🎜🎜🎜🎜🎜La pré-lecture Le mécanisme peut être subdivisé en Les deux types suivants : 🎜Utilisez l'algorithme LRU pour gérer les pages tampon les moins récemment utilisées et former une liste chaînée correspondante pour une élimination facile.
Lorsqu'une page est consultée [c'est-à-dire récemment consultée]
Alors pourquoi InnoDB n'utilise-t-il pas un algorithme LRU aussi intuitif ? Les raisons sont les suivantes :
Échec de la lecture anticipée
Les pages du pool de tampons en lecture anticipée seront placées en tête de la liste chaînée LRU, mais beaucoup d'entre elles risquent de ne pas être lues.
Pollution du pool tampon
Le chargement de nombreuses pages moins fréquemment utilisées dans le pool tampon éliminera les pages les plus fréquemment utilisées du pool tampon. Par exemple, analyse complète de la table
Sur la base des lacunes ci-dessus, la méthode spécifique optimisée divise la liste chaînée LRU traditionnelle en deux parties : zone de données chaudes [zone jeune] et zone de données froides [ancienne zone]
Le schéma structurel est le suivant :
Comme le montre la figure, la zone de données chaudes et la zone de données froides La zone de données occupe différentes proportions, nous pouvons alors contrôler la proportion de innodb_old_blocks_pct
启动选项来控制冷数据区域所占比例。
改进后的LRU如何更好的解决预读失效问题呢?
改进后的LRU如何更好的解决缓冲池污染问题呢?
先说结论,并没有很好的优化这个问题,原因如下【以全表扫描为例】:
那么到底该如何解决缓冲池污染问题呢?
innodb_old_blocks_time
zone de données froidesinnodb_old_blocks_pct
. Comment le LRU amélioré peut-il mieux résoudre le problème de l'échec de la lecture anticipée ?
Comment le LRU amélioré peut-il mieux résoudre le problème de la pollution du bassin tampon ?
Parlons d'abord de la conclusion. Ce problème n'a pas été bien optimisé. Les raisons sont les suivantes [prenons l'exemple du scan complet du tableau] : 🎜🎜🎜Une page visitée pour la première fois sera également placée en tête. de la zone de données froides, mais les visites ultérieures Il sera placé en tête de la zone de données chaudes, ce qui évincera également les pages avec une fréquence d'accès plus élevée. 🎜🎜🎜Alors comment résoudre le problème de pollution du bassin tampon ? 🎜🎜🎜Le pool de tampons introduit le mécanisme de fenêtre temporelle de la zone de données froides, c'est-à-dire que tant que l'intervalle de temps entre l'accès ultérieur à la page et le premier accès à la page est supérieur à la valeur de fenêtre spécifiée, la page sera déplacée de la zone de données froides à la zone de données chaudes. Si la valeur de la fenêtre est inférieure à la valeur spécifiée, l'opération de déplacement ne sera pas effectuée. 🎜🎜De même, la valeur de la fenêtre peut être définie via le paramètreinnodb_old_blocks_time
[unité ms]. La valeur par défaut est de 1 000 ms, et 1 s filtrera la plupart des opérations telles que les analyses de table complètes. Par exemple, lors d'une analyse complète d'une table, l'intervalle de temps entre plusieurs accès à une page ne dépassera pas 1 seconde. 🎜🎜🎜Pool de tampons VS cache de requêtes🎜🎜🎜Le pool de tampons et le cache de requêtes sont-ils la même chose ? →Non 🎜🎜🎜🎜Le pool de tampons essaiera de sauvegarder les données fréquemment utilisées Lorsque MySQL lit une page, il déterminera d'abord si la page est dans le pool de tampons. Si elle existe, elle sera lue directement. existe, elle sera lue directement. La page sera stockée dans le pool de mémoire tampon via la mémoire ou le disque puis lue. 🎜🎜Le cache de requête met en cache les résultats des requêtes à l'avance afin que vous puissiez obtenir les résultats directement sans les exécuter la prochaine fois. Il convient de noter que le cache de requêtes dans MySQL ne met pas en cache le plan de requête, mais les résultats correspondants de la requête. Les conditions d'accès sont strictes et tant que la table de données change, le cache de requêtes deviendra invalide, le taux d'accès est donc faible. 🎜🎜🎜【Recommandations associées : 🎜tutoriel vidéo mysql🎜】🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!