第十八周作业

1、总结mysql常见的存储引擎以及特点。

1、MyISAM存储引擎
MyISAM引擎特点:
● 不支持事务
● 表级锁定
● 读写相互阻塞,写入不能读,读时不能写
● 只缓存索引
● 不支持外键约束
● 不支持聚簇索引
● 读取数据较快,占用资源较少
● 不支持MVCC(多版本并发控制机制)高并发
● 崩溃恢复性较差
● MySQL5.5.5前默认的数据库引擎

MyISAM存储引擎适用场景:
● 只读(或者写较少)
● 表较小(可以接受长时间进行修复操作)

MyISAM引擎文件:
tbl_name.frm 表格式定义
tbl_name.MYD 数据文件
tbl_name.MYI 索引文件

2、 InnoDB引擎
InnoDB引擎特点
● 行级锁
● 支持事务,适合处理大量短期事务
● 读写阻塞与事务隔离级别相关
● 可缓存数据和索引
● 支持聚簇索引
● 崩溃恢复性更好
● 支持MVCC高并发
● 从MySQL5.5后支持全文索引
● 从MySQL5.5.5开始为默认的数据库引擎

InnoDB数据库文件:
● 所有InnoDB表的数据和索引放置于同一个表空间中
● 每个表单独使用一个表空间存储表的数据和索引

2、总结MySQL查询缓存优化总结。

查询缓存原理:
缓存SELECT操作或预处理查询的结果集和SQL语句,当有新的SELECT语句或预处理查询语句请求,先去查询缓存,判断是否存在可用的记录集,判断标准:与缓存的SQL语句,是否完全一样,区分大小写

优缺点:
不需要对SQL语句做任何解析和执行,当然语法解析必须通过在先,直接从Query Cache中获得查询结果,提高查询性能
查询缓存的判断规则,不够智能,也即提高了查询缓存的使用门槛,降低效率
查询缓存的使用,会增加检查和清理Query Cache中记录集的开销

查询缓存的工作流程:
命中条件:
缓存存在内存中的一个hash表中,通过查询SQL,查询数据库等作为key.在判断是否命中前,MySQL不会解析SQL,而是直接使用SQL去查询缓存,判断标准:与缓存的SQL语句,是否完全一样,区分大小写SQL任何字符上的不同,如空格,注释,都会导致缓存不命中.

  1. 服务器接收SQL,以SQL的语句为key查找缓存表(区分大小写和空格)
  2. 如果找到了缓存,则直接返回缓存(命中缓存)
  3. 如果没有找到缓存,则执行SQL查询,包括原来的SQL解析,优化等.
  4. 执行完SQL查询结果以后,将SQL查询结果存入缓存表(额外性能消耗)

SELECT语句的缓存控制:
● SQL_CACHE:显式指定存储查询结果于缓存之中
● SQL_NO_CACHE:显式查询结果不予缓存
● query_cache_type参数变量
● query_cache_type的值为OFF或0时,查询缓存功能关闭
● query_cache_type的值为ON或1时,查询缓存功能打开,SELECT的结果符合缓存条件即会缓存,否则,不予缓存,显式指定SQL_NO_CACHE,不予缓存,此为默认值
● query_cache_type的值为DEMAND或2时,查询缓存功能按需进行,显式指定SQL_CACHE的SELECT语句才会缓存;其它均不予缓存

查询缓存相关的状态变量:

SHOW GLOBAL STATUS LIKE 'Qcache%';

● Qcache_free_blocks:处于空闲状态 Query Cache中内存 Block 数
● Qcache_total_blocks:Query Cache 中总Block ,当Qcache_free_blocks相对此值较大时,可能用内存碎片,执行FLUSH QUERY CACHE清理碎片
● Qcache_free_memory:处于空闲状态的 Query Cache 内存总量
● Qcache_hits:Query Cache 命中次数
● Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次数,即没有命中的次数
● Qcache_lowmem_prunes:记录因为内存不足而被移除出查询缓存的查询数
● Qcache_not_cached:没有被 Cache 的 SQL 数,包括无法被 Cache 的 SQL 以及由于query_cache_type 设置的不会被 Cache 的 SQL语句
● Qcache_queries_in_cache:在 Query Cache 中的 SQL 数量

命中率和内存使用率估算:
● 查询缓存中内存块的最小分配单位query_cache_min_res_unit :

(query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache

● 查询缓存命中率 :

Qcache_hits / ( Qcache_hits + Qcache_inserts ) * 100%

● 查询缓存内存使用率:

(query_cache_size – qcache_free_memory) / query_cache_size * 100%

3、MySQL日志各类总结。

MySQL 支持丰富的日志类型,如下:
● 事务日志:transaction log
事务日志的写入类型为“追加”,因此其操作为“顺序IO”;通常也被称为:预写式日志 write ahead logging
事务日志文件: ib_logfile0, ib_logfile1
● 错误日志 error log
● 通用日志 general log
● 慢查询日志 slow query log
● 二进制日志 binary log
● 中继日志 reley log,在主从复制架构中,从服务器用于保存从主服务器的二进制日志中读取的事件

事务日志
事务日志:transaction log
事务型存储引擎自行管理和使用,建议和数据文件分开存放,redo log和undo log

Innodb事务日志相关配置:
show variables like '%innodb_log%';

innodb_log_file_size   50331648 每个日志文件大小
innodb_log_files_in_group  2     日志组成员个数
innodb_log_group_home_dir ./ 事务文件路径
innodb_flush_log_at_trx_commit 默认为1

事务日志性能优化

innodb_flush_log_at_trx_commit=0|1|2

1 此为默认值,日志缓冲区将写入日志文件,并在每次事务后执行刷新到磁盘。 这是完全遵守ACID特性
0 提交时没有写磁盘的操作; 而是每秒执行一次将日志缓冲区的提交的事务写入刷新到磁盘。 这样可提供更好的性能,但服务器崩溃可能丢失最后一秒的事务
2 每次提交后都会写入OS的缓冲区,但每秒才会进行一次刷新到磁盘文件中。 性能比0略差一些,但操作系统或停电可能导致最后一秒的交易丢失

高并发业务行业最佳实践,是使用第三种折衷配置(=2)
设置为1,同时sync_binlog = 1表示最高级别的容错

** 错误日志**
mysqld启动和关闭过程中输出的事件信息
mysqld运行中产生的错误信息
event scheduler运行一个event时产生的日志信息
在主从复制架构中的从服务器上启动从服务器线程时产生的信息
错误文件路径

SHOW GLOBAL VARIABLES LIKE 'log_error'

通用日志
通用日志:记录对数据库的通用操作,包括:错误的SQL语句
通用日志可以保存在:file(默认值)或 table(mysql.general_log表)
通用日志相关设置

general_log=ON|OFF
general_log_file=HOSTNAME.log
log_output=TABLE|FILE|NONE

慢查询日志
慢查询日志:记录执行查询时长超出指定时长的操作
慢查询相关变量

slow_query_log=ON|OFF #开启或关闭慢查询,支持全局和会话,只有全局设置才会生成慢查询文件
long_query_time=N #慢查询的阀值,单位秒
slow_query_log_file=HOSTNAME-slow.log  #慢查询日志文件
log_slow_filter = admin,filesort,filesort_on_disk,full_join,full_scan,
query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
#上述查询类型且查询时长超过long_query_time,则记录日志
log_queries_not_using_indexes=ON  #不使用索引或使用全索引扫描,不论是否达到慢查询阀值的语
句是否记录日志,默认OFF,即不记录
log_slow_rate_limit = 1 #多少次查询才记录,mariadb特有
log_slow_verbosity= Query_plan,explain #记录内容
log_slow_queries = OFF    #同slow_query_log,MariaDB 10.0/MySQL 5.6.1 版后已删除

二进制日志(备份)
● 记录导致数据改变或潜在导致数据改变的SQL语句
● 记录已提交的日志
● 不依赖于存储引擎类型
二进制日志记录三种格式
● 基于“语句”记录:statement,记录语句,默认模式( MariaDB 10.2.3 版本以下 ),日志量较少
● 基于“行”记录:row,记录数据,日志量较大,更加安全,建议使用的格式
● 混合模式:mixed, 让系统自行判定该基于哪种方式进行,默认模式( MariaDB 10.2.4及版本以上)

中继日志
功能类似二进制日志(备份用)
主要是主从数据库同步时,复制主数据库二进制日志记录,传递给从数据库的而进行日志记录

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、总结mysql常见的存储引擎以及特点。 1、 MyISAM存储引擎 MyISAM引擎特点:不支持事务表级锁定读...
    亨利阅读 301评论 1 0
  • 1、总结mysql常见的存储引擎以及特点。 存储引擎:负责把具体SQL语句的结果完成对磁盘上文件路径访问的转换,数...
    陌路残蝉阅读 177评论 1 0
  • 1、总结mysql常见的存储引擎以及特点。 1、1 MyISAM存储引擎 不支持事务 表级锁定 读写相互阻塞,写入...
    沐熙一叶_Leaf阅读 275评论 1 0
  • 1、运用haproxy实现nginx服务负载均衡 测试环境: Nginx1: 172.16.100.151 por...
    卫清华阅读 358评论 0 0
  • 1、实现基于MYSQL验证的vsftpd虚拟用户访问 主机:两台,一台为FTP服务器,一台为MySQL服务器 (1...
    Gustav_man阅读 216评论 0 0