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任何字符上的不同,如空格,注释,都会导致缓存不命中.
- 服务器接收SQL,以SQL的语句为key查找缓存表(区分大小写和空格)
- 如果找到了缓存,则直接返回缓存(命中缓存)
- 如果没有找到缓存,则执行SQL查询,包括原来的SQL解析,优化等.
- 执行完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及版本以上)
中继日志
功能类似二进制日志(备份用)
主要是主从数据库同步时,复制主数据库二进制日志记录,传递给从数据库的而进行日志记录