Mysql概述

基本描述

Mysql是典型的关系型数据库(RDBMS),按照行来存储。

sql语句

架构图

mysql架构图

如图所示,Mysql整体上分为server层和存储引擎层,其中引擎层被设计为可插拔的插件的形式。因此,Mysql支持多种存储引擎,比较常见的有Innodb和MyISAM。默认的的引擎是Innodb。存储引擎层提供数据操作的接口,供server层调用。Mysql的server层包含连接器(Connector)、解析器(Parser)、优化器(Optimizer)、执行器(Executor)以及查询缓存。

注意:查询缓存一般在生产环境是关闭的,因为查询缓存需要完全匹配,并且相关的表中数据有任何变化时会失效。因此,当数据频繁变化时,一方面缓存容易失效,另外,增加不必要的开销。 存储引擎层的逻辑是:获取复合条件的第一条,然后再一次获取第二条,以此类推。

Mysql查询语句的执行顺序

一条典型的mysql查询语句如下: SELECT xxx FROM T1 JOIN T2 ON T1.id=T2.tid WHERE xxx GROUP BY xxx HAVING xxx ORDER BY xxx LIMIT xxx 其执行按照如下顺序:

  1. FROM 确定要查询的表,如果有JOIN,则根据关联的字段生成表笛卡尔积的临时表TEMP1

  2. WHERE 根据条件过滤,过滤掉不合法的记录,生成TEMP2

  3. GROUP BY根据分组字段,进行分组,并执行相关的聚合函数,生成TEMP3

  4. HAVING 根据分组后的条件进行过滤,生成TEMP4

  5. SELECT 选出需要的字段,生成TEMP5

  6. DISTINCT 过滤重复的数据,生产TEMP6

  7. ORDER BY根据相应字段进行排序,返回一个游标

  8. LIMIT 翻页,返回数据

    注意:ON既可以进行过滤,也可以执行添加,在于使用的是inner join还是outer join。ON的过滤是在WHERE之前。 WHERE和HAVING作用的时间点不同,WHERE是作用在原始表的列上的,HAVING是在聚合后的。所以HAVING能够使用聚合后的列,也能够使用别名。WHERE只能看见原有表中的别,不能使用别名。但是,HAVING对于SELECT语句中没有的列是不能使用的,WHERE可以,只要原始表中存在。

Mysql执行计划

当我们使用explain查看mysql生成的执行计划时,会返回针对该条sql语句的预估的一些信息,其中包括:

id

id表 示的是mysql的执行优先级。由于一条sql中可能包含多个字查询,所以可能会有多条记录。id越大,优先级越高,id相同,则按照顺序依次执行。

select_type

type

执行计划中的type,这是个比较重要的参考,可能的值有all > index > range > ref > eq_ref > const > system。开销由大到小。

possible keys/key

可能使用的索引/最终决定使用的索引,如果对执行计划的索引的key的不满意,则可以使用USING INDEX去建议引擎使用,但是最终不一定使用。也可以使用FORCE INDEX去让引擎强制使用某个索引。

rows

语句要扫描的记录行数,这是个估计值。这是根据mysql统计数据和是否使用索引估计的一个值。

extra

其他附加信息,可能会有的值

存储引擎对比

一般我们常用就只有MyISAM(Indexed Sequential Access Method)和InnoDB两种存储引擎。