MySQL索引是存儲(chǔ)在磁盤上的數(shù)據(jù)結(jié)構(gòu),它包含有關(guān)表中的數(shù)據(jù)的快速訪問路徑。但是它不是完全存儲(chǔ)在磁盤上的。更確切地說,索引的一部分存儲(chǔ)在磁盤上,一部分存儲(chǔ)在內(nèi)存中。
當(dāng)我們在MySQL表上創(chuàng)建索引時(shí),索引會(huì)被存儲(chǔ)在磁盤上。這包括B-樹,B+樹和哈希索引。當(dāng)我們需要查詢數(shù)據(jù)時(shí),MySQL會(huì)加載這些索引到內(nèi)存中,并在內(nèi)存中使用這些索引來查找數(shù)據(jù)。在查詢期間,MySQL使用緩存來存儲(chǔ)最頻繁使用的索引和查詢結(jié)果,以便下次訪問時(shí)可以更快地返回結(jié)果。
MySQL中的緩存被稱為內(nèi)存池。內(nèi)存池包含所有MySQL使用的內(nèi)存,并且被動(dòng)態(tài)地分配和釋放。內(nèi)存池由多個(gè)緩存組成,包括池?cái)?shù)據(jù)緩存、池索引緩存和池實(shí)例緩存。池?cái)?shù)據(jù)緩存用于存儲(chǔ)表中的數(shù)據(jù)的緩存,池索引緩存用于存儲(chǔ)表中的索引的緩存,池實(shí)例緩存用于存儲(chǔ)MySQL服務(wù)器內(nèi)部狀態(tài)的緩存。
mysql>SHOW VARIABLES LIKE '%buffer%'; +-----------------------+----------------------+ | Variable_name | Value | +-----------------------+----------------------+ | bulk_insert_buffer_size | 8388608 | | innodb_buffer_pool_instances | 8 | | innodb_buffer_pool_size | 2147483648 | | innodb_change_buffer_max_size | 25 | | innodb_log_buffer_size | 16777216 | | join_buffer_size | 262144 | | key_buffer_size | 1073741824 | | myisam_sort_buffer_size | 8388608 | | net_buffer_length | 16384 | | preload_buffer_size | 32768 | | read_buffer_size | 131072 | | read_rnd_buffer_size | 262144 | | sort_buffer_size | 262144 | | sql_buffer_result | OFF | +-----------------------+----------------------+
我們可以使用“SHOW VARIABLES LIKE '%buffer%'”命令查看當(dāng)前MySQL中所有緩存的大小。在上面的代碼中,我們可以看到key_buffer_size和innodb_buffer_pool_size是兩個(gè)常見的緩存。key_buffer_size是用于MyISAM存儲(chǔ)引擎的索引緩存,而innodb_buffer_pool_size是用于InnoDB存儲(chǔ)引擎的數(shù)據(jù)和索引緩存。