2.mysql体系结构

 1.mysql体系结构
 分为两层:mysql server层和存储引擎层
 mysql server层:连接层和SQL层
 连接层:通信协议、线程处理、用户名密码认证
 SQL层:权限判断、解析器、预处理、查询优化器、缓存和执行计划
1.1 Query Cache解释
 生产中建议关闭query cache,因为只能缓存静态数据信息,5.6之后默认为关闭
 query_cache两个核心参数:
 show variables like '%query_cache_size%';
 show variable like '%query_cache_type%';
 
 mysql压力测试软件:sysbench
 https://dev/mysql.com/downloads/benchmarks.html
 tar -zxvf sysbench-0.4.8.tar.gz
 cd sysbench-0.4.8
 ./configure --with-mysql-includes=/usr/local/mysql/instance  --with-mysql-libs=/usr/local/mysql/lib
 make && make install
 
 测试1:query_cache_type=0,query_cache_size=0
 用户sysbench构造100000数据:
 ./sysbench --test=oltp --mysql-table-engine=innodb --mysql-driver=mysql --mysql-socket=/tmp/mysql.sock --mysql-user=root --mysql-host=localhost
 ./sysbench --test=oltp --mysql-table-engine=innnodb --mysql-db=test --oltp-table-size=100000 --db-driver=mysql --num-threads=16 --mysql-socket=/tmp/mysql.sock --mysql-user=root --mysql-host=localhost --mysql-password=root123 run
 测试2:query_cache_type=1,query_cache_size=0
 测试3:query_cache_type=0,query_cache_size=1
 
1.2存储引擎:
 主要分为:InnoDB、MyISAM、Memory 、Blackhole、TokuDB和mariaDB columnstore
 主流:InnoDB和MyISAM
 区别:
 1.InnoDB 支持事务,MYISAM不支持事务     (事务)
 2.InnoDB行锁,myISAM表锁     (锁粒度)
 3.InnoDB高并发,MyISAM低并发 (并发性)
 4.InnoDB数据和索引都存储在.Ibd文件里,并且都缓存在内存里;Myisam数据文件扩展名为.MYD,索引为.MYI,只缓存索引文件,不缓存数据文件  (构成结构和缓存机制)
 5.InnoDB需要扫描全表,统计所有行数,Myisam只需从计数器中读出保存好的行数即可

2. InnoDB体系结构:
2.1 数据库和数据库实例
 mysql为一个单进程多线程模型的数据库,数据库实例就是进程+内存的组合,线程帮忙数据从内存刷新到磁盘。
 InnoDB体系结构实际上由内存结构、线程、磁盘文件 三层组成
2.2 InnoDB逻辑存储结构
 逻辑存储单元分为:表空间、段、区和页。
 表空间:默认自动扩展为64M (show variables like '%auto%';数据库默认的ibdata1大小是10M,建议不使用10M的默认大小,建议调整为1G(show variables like '%innodb_data%')
 除系统表空间外,还有独立表空间,设置参数innodb_file_per_table=1即可
 回收表空间:alter table table_name engine=innodb或pt_online_schema_change命令,每个表文件都有.frm和.ibd文件描述符。
 共享表空间无法在线回收空间,需要全部innodb表中数据备份,删除原表,再导入与原表结构一样新表,统计分析和日志类不适合共享表空间。
 mysql5.7后多了临时表空间和通用表空间(很少用):
 临时表空间:innodb_temp_data_file_path,临时表的相关检索信息:information_schema库下innodb_temp_table_info表中,目前不能定义表空间文件存放路径,只能与innodb_data_home_dir一致(show variables like '%temp%')
 段:通常有数据段、回滚段、索引段等,段由N个区和32个零散页组成。段空间以区为单位进行扩展。一个表有4个段,是索引的2倍。
 区:由连续的页组成,区大小1M。
 页:一个区由64个连接页组成,页默认大小16KB
 行:InnoDB存储引擎有两种文件格式:Antelope和Barracuda,Antelope有compact(目前使用最多)和redundant两种记录格式,Barracuda有compressed和dynamic(mysql5.7使用)两种,row_format值为相关表使用的行格式存储类型:show table status like '%test%'\G;
 文件格式查看方式:show variables like '%innodb_file%;
 show variables like '%row_format%';
 show variables like '%innodb_file_format%';
2.3 内存结构
 类似Oracle,也可分为SGA和PGA;show variables like '%buffer%'查看;
 SGA主要内存组成:
 1.innodb_buffer_pool:用来缓存innodb表的数据,索引,插入缓冲,数据字典等信息。
 2.innodb_log_buffer:事物在内存中的缓冲,即redo log buffer的大小
 3.query cache:高速查询缓存,生产环境建立关闭。
 4.key_buffer_size:只用于MyISAM存储引擎表,缓存MyISAM存储
 5.innodb_additional_mem_pool_size:用来保存数据字典和其他内部数据结构的内存池的大小,Mysql5.7.4中移除了。
 PGA主要内存:
 1.sort_buffer_size:用于SQL语句在内存中的临时排序。
 2.join_buffer_size:表链接使用
 3.read_buffer_size:表顺序扫描的缓存(MYISAM)
 4.read_rnd_buffer_size:mysql随机读缓冲区大小
 两个特殊的表:tmp_table_size 在排序和分组时没用到索引时,就会使用临时表空间。
 max_heap_table_size:管理heap,memory存储引擎表。
 show variables like '%heap%';
 show variables like '%tmp_table_size%';
 生产环境建议设置一样值。
 show variables like '%tmp%';
2.4 各大刷新线程及其作用
 主线程:主循环loop(1秒和10秒操作)、后台循环background loop、刷新循环flush loop和暂停循环suspend loop。
 四大I/O线程:read thread、write thread、redo log thread 和change buffer thread。
 show variables like '%innodb_page%';
 show variables like '%innodb_purge_thread%';
2.5 内存刷新机制
 redo log buffer:重做,记录事务操作的变化,修改之后的值
 data buffer:
 binlog cache:
 默认有至少有两个redo log 文件:磁盘上ib_logfile(0~N)命名。
 redo log写的方式是顺序写、循环写:
 redo log 刷到磁盘条件(是物理日志):
 (a).通过innodb_flush_log_at_trx_commit参数控制(0 、1 、2)
 (b).master thread:每秒进行刷新
 (c).redo log buffer :使用超过一半时触发刷新
  binlog:mysql二进制日志文件,用于备份恢复和主从复制。通过参数sync_binlog决定,是逻辑日志。
 show variables like '%innodb_max_dirty_pages_pct';
 show variables like '%innodb_adaptive_flushing';
2.6 InnoDB的三大特性
 插入缓冲:show variables like '%change%';
 两次写:设置innodb_doublewrite为0 关闭双写缓冲
 自适应哈希索引:监控索引搜索,show variables like '%innodb_adaptive_hash_index';
 show variables like '%innodb_adaptive_hash_index_parts'(默认为8个最大为512个);
 show engine innodb status;输出的semaphores部分监控自适应哈希索引的使用及竟争情况。

猜你喜欢

转载自blog.csdn.net/wulinpingailxr/article/details/80578644