Mysql插拔式的存储引擎:html
CSV:https://dev.mysql.com/doc/refman/5.7/en/csv-storage-engine.htmlmysql
数据存储以CSV文件,会生成3个文件 table_name.CSM(元数据状态管理,数据行) table_name.CSV(数据文件) table_name.frm。特色:linux
不能定义没有索引、列定义必须为NOT NULL。sql
不能设置自增列,不适用大表或者数据的在线处理。缓存
CSV数据的存储用,隔开,可直接编辑CSV文件进行数据的编排,数据安全性低。安全
注:编辑以后,要生效使用 flush table XXX 命令。服务器
应用场景:数据的快速导出导入,表格直接转换成CSV。函数
Archive:https://dev.mysql.com/doc/refman/5.7/en/archive-storage-engine.html工具
会生成 table_name.ARZ table_name.frm,数据存储为ARZ文件格式。特色:测试
只支持 insert 和 select 两种操做,只容许自增ID列创建索引,行级锁,不支持事务,数据占用磁盘少。
应用场景:日志系统,大量的设备数据采集。
Memory(heap):https://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html
数据都是存储在内存中,IO效率要比其余引擎高不少,服务重启数据丢失,内存数据表默认只有16M。特色:
支持hash索引,B tree索引,默认hash(查找复杂度0(1)),字段长度都是固定长度varchar(32)=char(32),不支持大数据存储类型字段如 blog,text,表级锁
应用场景:等值查找热度较高数据,查询结果内存中的计算,大多数都是采用这种存储引擎,做为临时表存储需计算的数据。
Myisam:https://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html
Mysql5.5版本以前的默认存储引擎,较多的系统表也仍是使用这个存储引擎,系统临时表也会用到Myisam存储引擎。特色:
select count(*) from table 无需进行数据的扫描,数据(MYD)和索引(MYI)分开存储,表级锁,不支持事务。
Innodb:https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html
在建立好表结构而且指定搜索引擎为 Myisam以后,会在数据目录生成3个文件,分别是table_name.frm(表结构文件),table_name.idb(数据与索引保存文件)。Mysql5.5及之后版本的默认存储引擎
Key Advantages:Its DML operations follow the ACID model [事务ACID]。
Row-level locking[行级锁]InnoDB tables arrange your data on disk to optimize queriesbased on primary keys[汇集索引(主键索引)方式进行数据存储]。
To maintain data integrity, InnoDB supports FOREIGN KEY constraints[支持外键关系保证数据完整性]。
接下来看一下这些经常使用的搜索引擎的简单对比图,也能看出为何InnoDB最后悔脱颖而出:
由下图能够看出Mysql的执行流程大体分为 5 个阶段:
咱们能够根据执行的流程来看一下在优化的过程当中须要注意点什么。
Mysql客户端与服务端的通讯方式是“半双工”的通讯方式,通讯方式主要分为如下三种:
半双工通讯:
在任何一个时刻,要么是有服务器向客户端发送数据,要么是客户端向服务端发送数据,这两个动做不能同时发生。因此咱们没法也无需将一个消息切成小块进行传输
特色和限制:
客户端一旦开始发送消息,另外一端要接收完整个消息才能响应。客户端一旦开始接收数据无法停下来发送指令。
mysql 客户端/服务端通讯--查询状态
有一整套状态集去管理状态。对于一个mysql链接,或者说一个线程,时刻都有一个状态来标识这个链接正在作什么。查看命令 show full processlist / show processlist
要了解状态的全过程请登陆:https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html (状态全集)。如下是常见的状态集:
异常状况下可经过kill {id}的方式进行链接的杀掉
工做原理:缓存SELECT操做的结果集和SQL语句;新的SELECT语句,先去查询缓存,判断是否存在可用的记录集。
判断标准:与缓存的SQL语句,是否彻底同样,区分大小写 (简单认为存储了一个key-value结构,key为sql,value为sql查询结果集)。
能够经过如下命令来查看缓存的设置状况:
在my.cnf配置文件中能够配置:
query_cache_type:
query_cache_size:容许设置query_cache_size的值最小为40K,默认1M,推荐设置 为:64M/128M;
query_cache_limit:限制查询缓存区最大能缓存的查询记录集,默认设置为1M
能够经过 show status like 'Qcache%' 命令可查看缓存状况:
须要注意的是,一旦表数据发生一点变化,与这个表所相关的缓存所有失效,不会缓存的状况:
为何mysql默认关闭了缓存开启??
适用场景 :以读为主的业务,数据生成以后就不常改变的业务。好比门户类、新闻类、报表类、论坛类等
查询优化处理的三个阶段:
查询优化器如何找到最优计划 ,经过explain +查询sql查看执行计划+\G。
查询优化器如何找到最优执行计划,有以下规则:
Mysql的查询优化器是基于成本计算的原则。他会尝试各类执行计划。数据抽样的方式进行试验(随机的读取一个4K的数据块进行分析)。
mysql查询优化 -执行计划:使用命令查看一句查询SQL,看看查询计划中都涉及什么有用的信息
id:select查询的序列号,标识执行的顺序
select_type:查询的类型,主要是用于区分普通查询、联合查询、子查询等
table :查询涉及到的表
type:访问类型,sql查询优化中一个很重要的指标,结果值从好到坏依次是:system > const > eq_ref > ref > range > index > ALL
执行计划:
possible_keys:查询过程当中有可能用到的索引
key:实际使用的索引,若是为NULL,则没有使用索引 rows,根据表统计信息或者索引选用状况,大体估算出找到所需的记录所须要读取的行数。
filtered:它指返回结果的行占须要读到的行(rows列的值)的百分比。表示返回结果的行数占需读取行数的百分比,filtered的值越大越好。
Extra :十分重要的额外信息
调用插件式的存储引擎的原子API的功能进行执行计划的执行,执行计划的好坏也是依赖于搜索引擎的。
一、有须要作缓存的,执行缓存操做。
二、增量的返回结果:开始生成第一条结果时,mysql就开始往请求方逐步返回数据。
好处: mysql服务器无须保存过多的数据,浪费内存。用户体验好,立刻就拿到了数据。
慢日志查询配置:
show variables like 'slow_query_log' //--查看是否开启慢日志保存 set global slow_query_log = on //-- 打开慢日志 set global slow_query_log_file = '/var/lib/mysql/gupaoedu-slow.log' //--慢日志保存位置 set global log_queries_not_using_indexes = on //-- 没有命中索引的是否要记录慢日志 set global long_query_time = 0.1 (秒) //-- 执行时间超过多少为慢日志
能够直接打开编辑 vi slow.log文件来查看,以下图的信息:
慢日志分析工具:
mysqldumpslow -t(查询多少行) 10 -s at(平均查询时间) /var/lib/mysql/gupaoedu-slow.log
经过返回的记录能看到前10条执行效率比较低下的sql信息,开发者能够经过这些信息去作相应的优化。