Mysql架构图
1 Connectors指的是不同语言中与SQL的交互
2 Management Serveices & Utilities: 系统管理和控制工具
3 Connection Pool: 连接池。
管理缓冲用户连接,线程处理等需要缓存的需求
4 SQL Interface: SQL接口。
接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
5 Parser: 解析器。
SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。
主要功能:
a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的
b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
6 Optimizer: 查询优化器。
SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询。
用一个例子就可以理解: select uid,name from user where gender = 1;
这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤
这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤
将这两个查询条件联接起来生成最终查询结果
7 Cache和Buffer: 查询缓存。
如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等
8 Engine :存储引擎。
存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。
Mysql的存储引擎是插件式的。它根据MySql AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)
现在有很多种存储引擎,各个存储引擎的优势各不一样,最常用的MyISAM,InnoDB,BDB
默认下MySql是使用MyISAM引擎,它查询速度快,有较好的索引优化和数据压缩技术。但是它不支持事务。
InnoDB支持事务,并且提供行级的锁定,应用也相当广泛。
Mysql也支持自己定制存储引擎,甚至一个库中不同的表使用不同的存储引擎,这些都是允许的。
InnoDB架构图
后台线程简介:
1、Master ThreadMaster Thread 是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲(INSERT BUFFER)、回滚页(UNDO PAGE)的回收等。
2、IO Thread在InnoDB存储引擎中大量使用了AIO(Async IO)来处理IO请求,这样可以极大提高数据库的性能。而IO Thread(insert buffer thread、log thread、read thread、write thread)的工作主要是负责这些IO请求的回调(call back)处理
3、缓冲池会有多个,默认为8个,多个池可以增加数据库的并发处理能力
4、缓冲池使用的是LRU算法,经过了修改,新读取到的页不是直接放到LRU首部,而是放在3/8处的位置,这个值可以通过
innodb_old_blocks_pct 设置,这个值默认是37,表示新读取的值放到LRU37%的位置
因为某些操作(比如遍历)只是一次性的,如果每次都把这种页放到LRU首部会影响正常的热点页
当读取到这个页经过了若干时间后会被放到LRU首部,这个时间又参数
innodb_old_blocks_time 来控制的
重做日志
Mysql默认情况下会有两个文件:ib_logfile0和ib_logfile1,这两个文件就是重做日志文件,或者事务日志。
重做日志的目的:万一实例或者介质失败,重做日志文件就能派上用场。
每个InnoDB存储引擎至少有一个重做日志文件组,每个文件组下至少有2个重做日志文件,如默认的ib_logfile0、ib_logfile1。InnoDB存储引擎先写重做日志文件1,当达到文件的最后时,会切换至重做日志文件2,当重做日志文件2也被写满时,会再被切换到重做日志文件1中。
影响重做日志的参数:
Innodb_log_file_size、innodb_log_files_in_group、innodb_log_group_home_dir影响着重做日志文件的属性。
undo log是一种日志,日志中记录对于数据库的反向操作。
如果把数据库的内容当做一种状态机,那么数据的写操作就是修改状态机的命令,而undo 就对应修改状态机的反向命令。
所以理论上每一个对于状态机修改的命令都会产生对应一条相当的undo log,以便事务回滚的时候,能够把状态机修改到事务原来的样子。
和Undo Log相反,Redo Log记录的是新数据的备份。在事务提交前,只要将Redo Log持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是Redo Log已经持久化。系统可以根据Redo Log的内容,将所有数据恢复到最新的状态。
Checkpoint机制
1.主线程定期刷新一些页到磁盘
2.LRU队列的空闲页不够,参数 innodb_lru_scan_depth控制LRU列表中可用页的数量
3.重做日志不够了
4.脏也太多了,参数innodb_max_dirty_pages_pct控制脏也比列,值为75%
insert buffer
插入缓冲,并不是缓存的一部分,而是物理页,对于非聚集索引的插入或更新操作,不是每一次直接插入索引页.而是先判断插入的非聚集索引页是否在缓冲池中.如果在,则直接插入,如果不再,则先放入一个插入缓冲区中.然后再以一定的频率执行插入缓冲和非聚集索引页子节点的合并操作.使用条件:非聚集索引,非唯一
因为主键肯定都是顺序的,唯一索引插入的时候要先检查一下(肯定有一个随机IO),对于非唯一所以只要插入就行了,而这个插入可能会产生随机IO,所以insert buffer的原理就是将多次随机IO合并,用顺序IO替代随机IO
-- 看看合并操作节省了多少IO请求,(1034310+3)/113909=9.08 ------------------------------------- INSERT BUFFER AND ADAPTIVE HASH INDEX ------------------------------------- Ibuf: size 1, free list len 134, seg size 136, 113909 merges merged operations: insert 3, delete mark 2319764, delete 1034310 discarded operations: insert 0, delete mark 0, delete 0 Hash table size 288996893, node heap has 304687 buffer(s) 1923.58 hash searches/s, 1806.60 non-hash searches/s
对于SSD这种优化随机IO的方式可能就不需要了
mysql高版本又加了一个增强的change buffer,支持delete,update等操作原理跟insert buffer一样
double write
InnoDB 的Page Size一般是16KB,其数据校验也是针对这16KB来计算的,将数据写入到磁盘是以Page为单位进行操作的。而计算机硬件和操作系统,在极端情况下(比如断电)往往并不能保证这一操作的原子性,16K的数据,写入4K 时,发生了系统断电/os crash ,只有一部分写是成功的,这种情况下就是 partial page write 问题。
很多DBA 会想到系统恢复后,MySQL 可以根据redolog 进行恢复,而mysql在恢复的过程中是检查page的checksum,checksum就是pgae的最后事务号,发生partial page write 问题时,page已经损坏,找不到该page中的事务号,就无法恢复。
double write架构
Innodb_dblwr_pages_written 写入多少次double write
Innodb_dblwr_writes 实际写入的次数
这两个参数通过 SHOW STATUS LIKE 'innodb%'; 查看
如果需要更快的性能,或者文件系统本身就提供部分写失效的问题,可以将双写关闭
通过参数 skip_innodb_doublewrite 设置
自适应hash
自适应哈希索引采用之前讨论的哈希表的方式实现,不同的是,这仅是数据库自身创建并使用的,DBA本身并不能对其进行干预。自适应哈希索引近哈希函数映射到一个哈希表中,因此对于字典类型的查找非常快速,如SELECT * FROM TABLE WHERE index_col='xxx'但是对于范围查找就无能为力。通过SHOW ENGINE INNODB STATUS 可以看到当前自适应哈希索引的使用情况
-- 这里显示了每秒使用自适应hash的次数,以及没有用到hash的次数 Hash table size 4425293, node heap has 1337 buffer(s) 174.24 hash searches/s, 169.49 non-hash searches/s
参数 innodb_adaptive_hash_index 禁用或启动此特性,默认是开启
Innodb还提供了刷新临近页面的功能,这是为了优化传统机械盘的,如果是SSD就不需要了
通过参数 innodb_flush_neighbors 开启或关闭这个功能
每个池前面有标示符
--- BUFFER POOL 0 显示
---BUFFER POOL 0 Buffer pool size 65528 --当前buffer一共有多少页(一页16K) Free buffers 48335 --当前缓冲池空闲页 Database pages 16892 --当前缓冲池的LRU页数量 Old database pages 6255 Modified db pages 654 Pending reads 0 Pending writes: LRU 0, flush list 0, single page 0 Pages made young 189, not young 0 0.00 youngs/s, 0.00 non-youngs/s Pages read 10029, created 6863, written 172659 0.00 reads/s, 0.00 creates/s, 0.00 writes/s Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000 Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
Pages made young 是从old变到首部的页数量
not young是因为innodb_old_blocks_time的限制没有变到首部的数量
Buffer pool hit rate 是命中率
youngs/s 和 non-youngs/s 是每秒变到首部和没有变到首部的页数量
LRU len:1539 , unzip_LRU len : 156 LRU长度是一共有多少页,unzip表示未压缩的页
information_schema库中
INNODB_BUFFER_POOL_STATUS记录了每个缓冲池的状态
INNODB_BUFFER_PAGE_LRU unzip LRU状态
Mysql引擎相关属性
mysql> show engine innodb status\G *************************** 1. row *************************** Type: InnoDB Name: Status: ===================================== 2017-03-23 10:51:31 0x19f0 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 4 seconds ----------------- BACKGROUND THREAD ----------------- srv_master_thread loops: 1 srv_active, 0 srv_shutdown, 5996 srv_idle srv_master_thread log flush and writes: 5997 ---------- SEMAPHORES ---------- OS WAIT ARRAY INFO: reservation count 34 OS WAIT ARRAY INFO: signal count 20 RW-shared spins 0, rounds 20, OS waits 3 RW-excl spins 0, rounds 174, OS waits 1 RW-sx spins 0, rounds 0, OS waits 0 Spin rounds per wait: 20.00 RW-shared, 174.00 RW-excl, 0.00 RW-sx ------------ TRANSACTIONS ------------ Trx id counter 65283 Purge done for trx's n:o < 58732 undo n:o < 0 state: running but idle History list length 277 LIST OF TRANSACTIONS FOR EACH SESSION: ---TRANSACTION 281475142321968, not started 0 lock struct(s), heap size 1136, 0 row lock(s) -------- FILE I/O -------- I/O thread 0 state: wait Windows aio (insert buffer thread) I/O thread 1 state: wait Windows aio (log thread) I/O thread 2 state: wait Windows aio (read thread) I/O thread 3 state: wait Windows aio (read thread) I/O thread 4 state: wait Windows aio (read thread) I/O thread 5 state: wait Windows aio (read thread) I/O thread 6 state: wait Windows aio (write thread) I/O thread 7 state: wait Windows aio (write thread) I/O thread 8 state: wait Windows aio (write thread) I/O thread 9 state: wait Windows aio (write thread) Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] , ibuf aio reads:, log i/o's:, sync i/o's: Pending flushes (fsync) log: 0; buffer pool: 0 419 OS file reads, 53 OS file writes, 7 OS fsyncs 0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s ------------------------------------- INSERT BUFFER AND ADAPTIVE HASH INDEX ------------------------------------- Ibuf: size 1, free list len 0, seg size 2, 0 merges merged operations: insert 0, delete mark 0, delete 0 discarded operations: insert 0, delete mark 0, delete 0 Hash table size 2267, node heap has 0 buffer(s) Hash table size 2267, node heap has 0 buffer(s) Hash table size 2267, node heap has 0 buffer(s) Hash table size 2267, node heap has 0 buffer(s) Hash table size 2267, node heap has 0 buffer(s) Hash table size 2267, node heap has 0 buffer(s) Hash table size 2267, node heap has 0 buffer(s) Hash table size 2267, node heap has 0 buffer(s) 0.00 hash searches/s, 0.00 non-hash searches/s --- LOG --- Log sequence number 12560144 Log flushed up to 12560144 Pages flushed up to 12560144 Last checkpoint at 12560135 0 pending log flushes, 0 pending chkp writes 10 log i/o's done, 0.00 log i/o's/second ---------------------- BUFFER POOL AND MEMORY ---------------------- Total large memory allocated 8585216 Dictionary memory allocated 1239320 Buffer pool size 512 Free buffers 254 Database pages 258 Old database pages 0 Modified db pages 0 Pending reads 0 Pending writes: LRU 0, flush list 0, single page 0 Pages made young 0, not young 0 0.00 youngs/s, 0.00 non-youngs/s Pages read 382, created 34, written 36 0.00 reads/s, 0.00 creates/s, 0.00 writes/s No buffer pool page gets since the last printout Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s LRU len: 258, unzip_LRU len: 0 I/O sum[0]:cur[0], unzip sum[0]:cur[0] -------------- ROW OPERATIONS -------------- 0 queries inside InnoDB, 0 queries in queue 0 read views open inside InnoDB Process ID=2056, Main thread ID=2376, state: sleeping Number of rows inserted 0, updated 0, deleted 0, read 8 0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s ---------------------------- END OF INNODB MONITOR OUTPUT ============================ 1 row in set (0.00 sec)
Innodb相关的参数
innodb_adaptive_flushing ON innodb_adaptive_flushing_lwm 10 innodb_adaptive_hash_index ON innodb_adaptive_hash_index_parts 8 innodb_adaptive_max_sleep_delay 150000 innodb_api_bk_commit_interval 5 innodb_api_disable_rowlock OFF innodb_api_enable_binlog OFF innodb_api_enable_mdl OFF innodb_api_trx_level 0 innodb_autoextend_increment 64 innodb_autoinc_lock_mode 1 innodb_buffer_pool_chunk_size 134217728 innodb_buffer_pool_dump_at_shutdown ON innodb_buffer_pool_dump_now OFF innodb_buffer_pool_dump_pct 25 innodb_buffer_pool_filename ib_buffer_pool innodb_buffer_pool_instances 8 innodb_buffer_pool_load_abort OFF innodb_buffer_pool_load_at_startup ON innodb_buffer_pool_load_now OFF innodb_buffer_pool_size 8589934592 innodb_change_buffer_max_size 25 innodb_change_buffering all innodb_checksum_algorithm crc32 innodb_checksums ON innodb_cmp_per_index_enabled OFF innodb_commit_concurrency 0 innodb_compression_failure_threshold_pct 5 innodb_compression_level 6 innodb_compression_pad_pct_max 50 innodb_concurrency_tickets 5000 innodb_data_file_path ibdata1:12M:autoextend innodb_data_home_dir innodb_deadlock_detect ON innodb_default_row_format dynamic innodb_disable_sort_file_cache OFF innodb_doublewrite ON innodb_fast_shutdown 1 innodb_file_format Barracuda innodb_file_format_check ON innodb_file_format_max Barracuda innodb_file_per_table ON innodb_fill_factor 100 innodb_flush_log_at_timeout 1 innodb_flush_log_at_trx_commit 2 innodb_flush_method innodb_flush_neighbors 1 innodb_flush_sync ON innodb_flushing_avg_loops 30 innodb_force_load_corrupted OFF innodb_force_recovery 0 innodb_ft_aux_table innodb_ft_cache_size 8000000 innodb_ft_enable_diag_print OFF innodb_ft_enable_stopword ON innodb_ft_max_token_size 84 innodb_ft_min_token_size 3 innodb_ft_num_word_optimize 2000 innodb_ft_result_cache_limit 2000000000 innodb_ft_server_stopword_table innodb_ft_sort_pll_degree 2 innodb_ft_total_cache_size 640000000 innodb_ft_user_stopword_table innodb_io_capacity 200 innodb_io_capacity_max 2000 innodb_large_prefix ON innodb_lock_wait_timeout 50 innodb_locks_unsafe_for_binlog OFF innodb_log_buffer_size 8388608 innodb_log_checksums ON innodb_log_compressed_pages ON innodb_log_file_size 50331648 innodb_log_files_in_group 2 innodb_log_group_home_dir ./ innodb_log_write_ahead_size 8192 innodb_lru_scan_depth 1024 innodb_max_dirty_pages_pct 75.000000 innodb_max_dirty_pages_pct_lwm 0.000000 innodb_max_purge_lag 0 innodb_max_purge_lag_delay 0 innodb_max_undo_log_size 1073741824 innodb_monitor_disable innodb_monitor_enable innodb_monitor_reset innodb_monitor_reset_all innodb_old_blocks_pct 37 innodb_old_blocks_time 1000 innodb_online_alter_log_max_size 134217728 innodb_open_files 2000 innodb_optimize_fulltext_only OFF innodb_page_cleaners 4 innodb_page_size 16384 innodb_print_all_deadlocks OFF innodb_purge_batch_size 300 innodb_purge_rseg_truncate_frequency 128 innodb_purge_threads 4 innodb_random_read_ahead OFF innodb_read_ahead_threshold 56 innodb_read_io_threads 4 innodb_read_only OFF innodb_replication_delay 0 innodb_rollback_on_timeout OFF innodb_rollback_segments 128 innodb_sort_buffer_size 1048576 innodb_spin_wait_delay 6 innodb_stats_auto_recalc ON innodb_stats_method nulls_equal innodb_stats_on_metadata OFF innodb_stats_persistent ON innodb_stats_persistent_sample_pages 20 innodb_stats_sample_pages 8 innodb_stats_transient_sample_pages 8 innodb_status_output OFF innodb_status_output_locks OFF innodb_strict_mode ON innodb_support_xa ON innodb_sync_array_size 1 innodb_sync_spin_loops 30 innodb_table_locks ON innodb_temp_data_file_path ibtmp1:12M:autoextend innodb_thread_concurrency 8 innodb_thread_sleep_delay 0 innodb_tmpdir innodb_undo_directory ./ innodb_undo_log_truncate OFF innodb_undo_logs 128 innodb_undo_tablespaces 0 innodb_use_native_aio OFF innodb_version 5.7.15 innodb_write_io_threads 4
一些参数
-- 缓冲区实例个数 SHOW VARIABLES LIKE 'innodb_buffer_pool_instances' -- 缓冲区大小 SHOW VARIABLES LIKE 'innodb_buffer_pool_size'
参考
相关推荐
《MySQL技术内幕:InnoDB存储引擎》是一本深入剖析InnoDB存储引擎的书籍,它的作者姜承尧以源代码解析的方式,向我们展示了InnoDB的体系结构、实现原理和工作机制。这本书不仅具有极高的理论价值,而且对实际应用也...
### MySQL体系结构及原理...综上所述,MySQL的体系结构和InnoDB存储引擎的设计都是为了应对现代数据处理的挑战。通过对这些关键问题的理解,我们可以更好地优化MySQL的配置和使用策略,以满足各种应用场景的需求。
【InnoDB存储引擎】 InnoDB是MySQL中最常用的存储引擎,尤其在支持事务处理的场景下。它具备以下特性: 1. **事务支持**:InnoDB支持ACID(原子性、一致性、隔离性、持久性)事务,保证数据操作的完整性。 2. **...
MySQL是世界上最受欢迎的开源数据库系统之一,而InnoDB存储引擎是其最常用的核心组件,尤其在处理事务性和ACID(原子性、一致性、隔离性、持久性)需求方面。本资料包包含三本关于MySQL和InnoDB的重要书籍,分别是...
MySQL InnoDB 存储引擎是 MySQL 关系数据库管理系统中最常用的存储引擎之一。InnoDB 存储引擎是 MySQL 的默认存储引擎,它提供了高性能、高可靠性的存储功能。 数据库和实例的区别 ----------------- 在 MySQL 中...
除了InnoDB和MyISAM之外,MySQL还支持多种其他的存储引擎,如Memory、Archive、Federated等,这些引擎各有特色,可以满足不同的业务需求。 #### 四、存储引擎选择 选择合适的存储引擎对于保证数据库性能和稳定性至...
本书不仅介绍 MySQL 的基础知识、架构和原理,还详细阐述了 InnoDB 存储引擎的特点、优势和使用方法,以及如何将其应用到实践中。 通过本书的阅读和学习,读者将深入了解 MySQL 的核心技术和 InnoDB 存储引擎的关键...
2. InnoDB存储引擎架构:InnoDB是MySQL中最常用的存储引擎之一,其架构设计包含若干关键组件。在执行更新语句时,存储引擎会执行一系列操作以确保数据的一致性和安全性。 3. 缓冲池(Buffer Pool):缓冲池是InnoDB...
《Innodb架构、性能优化》是一份深入探讨MySQL数据库InnoDB存储引擎的文档,主要关注其架构设计和性能调优策略。InnoDB是MySQL中最常用的存储引擎,尤其在处理事务性和复杂查询方面表现出色。以下是对InnoDB核心概念...
通过何登成的简介可以看到他在InnoDB存储引擎的架构设计和研发上具备丰富的经验,这对于从事InnoDB性能优化和问题解决的DBA来说是非常有帮助的。 总结来说,InnoDB存储引擎是一个功能强大、复杂且成熟的数据库存储...
在这次大会上,他向与会者深入解析了MySQL的InnoDB存储引擎的内部机制和特性。下面将详细介绍他所分享的内容。 首先,InnoDB是一个重要的MySQL存储引擎,以其事务处理能力和行级锁定的特性而著名。Calvin Sun在演讲...
《高性能mysql(第3版)》是最具代表性的进阶书籍没有之一,它是 MySQL 领域的经典之作,内容涵盖 MySQL 架构和历史,性能分析,优化,复制、备份和恢复,高可用与高可扩展性。值得每一个后端工程师多次阅读,无论是...
InnoDB存储引擎支持事务处理、行级锁定和外键等特性,适用于需要高可靠性和高并发处理的系统。 并发控制是数据库管理中的一个重要部分,目的是为了避免多线程环境下多个事务同时修改数据造成的不一致问题。MySQL...
根据提供的标题“MySQL 技术内幕:InnoDB存储引擎”,我们可以深入探讨InnoDB存储引擎的相关知识点,包括其架构原理、特点、应用场景以及优化方法等方面。 ### InnoDB存储引擎概述 InnoDB是MySQL中最常用的一种...
mysql架构设计与InnoDB存储引擎详解
1. **性能提升**:MySQL 5.7通过优化查询执行引擎、缓存策略和InnoDB存储引擎提供了显著的性能提升,使得处理大数据集更加高效。 2. **InnoDB增强**:InnoDB存储引擎在5.7版本中得到了显著强化,包括支持更大的索引...
10. **性能优化**:此版本的MySQL支持InnoDB存储引擎的性能优化,如InnoDB Buffer Pool、索引优化、并行查询处理等,以提高数据读写速度和整体性能。 总之,`mysql-community-server-8.4.0-1.el9.x86_64`是为RHEL/...
10. **并行查询**:MySQL 8.x版本引入了并行查询优化,尤其是在InnoDB存储引擎中,这提升了复杂查询的执行速度。 通过阅读`mysql-8.2.0`源码,开发人员能够了解MySQL的内部机制,从而更好地优化应用程序、调试问题...