MySQL存储引擎
MySQL存储引擎采用插拔式的插件方式 ,指定在表之上的,即一个库中的每一个表都可 以指定专用的存储引擎。不管表采用什么样的存储引擎,都会在数据区,产生对应 的一个frm文件(表结构定义描述文件)
CVS存储引擎
不能使用索引,列不能为null,且不能设置自增列。
数据存储以csv存储,可以直接修改csv文件来修改表数据。
适合用于数据的快速导出导入,表格直接转换成CSV。
Archive存储引擎
只支持insert和select两种操作。
只允许自增ID列建立索引,行级锁,不支持事务。
可以对数据进行压缩占用磁盘少。
适用于存储大量数据不变的系统,如日志系统、设备信息采集系统等。
Memory存储引擎
数据都是存储在内存中,IO效率要比其他引擎高很多 服务重启数据丢失,内存数据表默认只有16M。
默认hash索引(查找复杂度0(1))。
字段长度都是固定长度varchar(32)=char(32) 不支持大数据存储类型字段如 text 。
查询如果涉及到计算一般会采用这种存储引擎作为临时表存储需计算的数据。
Myisam存储引擎
select count操作无需进行数据的扫描; 数据(MYD)和索引(MYI)分开存储;表级锁 ;不支持事务
适用于读多写少且无事务的表。mysql部分系统表会使用此引擎。
Innodb存储引擎
行级锁,支持事务,支持外键约束,采用聚集索引存储数据。
MySQL的sql执行流程
1.客户端与服务端通信,采用半双工的方式,即在任何一个时刻,要么是有服务器向客户端发送数据,要么是客户端向服务端发送数据,这两个动作不能同时发生。而且一旦开始发送消息,另一端要接收完整个消息才能响应。 客户端一旦开始接收数据没法停下来发送指令。
2.根据sql语句查找是否存在查询缓存,若有直接返回缓存数据。查询缓存默认关闭,原因是:
在查询之前必须先检查是否命中缓存,浪费计算资源。
如果这个查询可以被缓存,那么执行完成后,MySQL发现查询缓存中没有这 个查询,则会将结果存入查询缓存,这会带来额外的系统消耗。
针对表进行写入或更新数据时,将对应表的所有缓存都设置失效。
如果查询缓存很大或者碎片很多时,这个操作可能带来很大的系统消耗。
3.查询优化处理。首先解析sql生成语法树,然后对语法树预处理,检验合法性和权限验证,最后查询优化器寻找最优的执行计划。Mysql的查询优化器是基于成本计算的原则。他会尝试各种执行计划。 数据抽样的方式进行试验(随机的读取一个4K的数据块进行分析)。
4.存储引擎执行计划
5.返回客户端。增量的返回执行结果,开始生成第一条结果时,mysql就开始往请求方逐步返回数据 。
如何查找慢sql
1.修改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 (秒)
2.通过mysqldumpslow工具来进行慢查询日志分析:
mysqldumpslow -t 10 -s at /var/lib/mysql/gupaoedu-slow.log
3.使用explain 要执行的sql \G 查看sql的详细执行计划。