MySQL—05—MySQL如何处理SQL语句;MySQL数据库存储引擎介绍;

 


 

 

一、 MySQL 中的执行计划

1 MySQL 执行计划

MySQL 中可以通过 explain 关键字模拟优化器,执行 SQL 语句,从而知道 MySQL

如何处理 SQL 语句的。

2 MySQL 整个查询执行过程

• 客户端向 MySQL 服务器发送一条查询请求

• 服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段

• 服务器进行 SQL 解析、预处理、再由优化器生成对应的执行计划

• MySQL 根据执行计划,调用存储引擎的 API 来执行查询

• 将结果返回给客户端,同时缓存查询结果

3 启动执行计划

EXPLAIN SELECT 投影列 FROM 表名 WHERE 条件

 

 

 

 

4 EXPLAIN 列的解释

4.1ID

查询执行顺序:

  • id 值相同被视为一组
  • id 值相同时表示从上向下执行
  • 如果是子查询,id 值会递增,id 值越高,优先级越高

4.2select_type

  • simple:表示查询中不包含子查询或者 union
  • primary:当查询中包含任何复杂的子部分,最外层的查询被标记成 primary
  • derived: from 的列表中包含的子查询被标记成 derived
  • subquery: select where 列表中包含了子查询,则子查询被标记成 subquery
  • union:两个 select 查询时前一个标记为 PRIMARY,后一个标记为 UNION。union 出现
  • from 从句子查询中,外层 select 标记为 PIRMARY,union 中第一个查询为 DERIVED,第二个子查询标记为 UNION
  • unionresult:从 union 表获取结果的 select 被标记成 union result

4.3table

  • 显示这一行的数据是关于哪张表的。

4.4type

这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为 system、consteq_reg、ref、range、index ALL

  • system:表中只有一行数据。属于 const 的特例。如果物理表中就一行数据为 ALL
  • const :查询结果最多有一个匹配行。因为只有一行,所以可以被视为常量。const 查询速度非常快,因为只读一次。一般情况下把主键或唯一索引作为唯一条件的查询都是 const
  • eq_ref:查询时查询外键表全部数据。且只能查询主键列或关联列。且外键表中外键列中数据不能有重复数据,且这些数据都必须在主键表中有对应数据(主键表中数据可以有没有用到的)
  • ref:相比 eq_ref,不对外键列有强制要求,里面的数据可以重复,只要出现重复的数据取值就是 ref。也可能是索引查询。
  • range:把这个列当作条件只检索其中一个范围。常见 where 从句中出现 between、<、in 等。主要应用在具有索引的列中
  • index:这个连接类型对前面的表中的每一个记录联合进行完全扫描(比 ALL 更好,因为索引一般小于表数据)。
  • ALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免。也就是对全表扫描。

4.5possible_keys

查询条件字段涉及到的索引,可能没有使用。

4.6Key

实际使用的索引。如果为 NULL,则没有使用索引。

4.7key_len

表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用

长度,理论上长度越短越好。key_len 是根据表定义计算而得的,不是通过表内检索出的。

4.8ref

显示索引的哪一列被使用了,如果可能的话,是一个常量 const。4.9rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。

4.10Fitered

显示了通过条件过滤出的行数的百分比估计值。

4.11extra

MYSQL 如何解析查询的额外信息。

Distinct:MySQL 发现第 1 个匹配行后,停止为当前的行组合搜索更多的行。

Not exists:MySQL 能够对查询进行 LEFT JOIN 优化,发现 1 个匹配 LEFT JOIN 标准的行

后,不再为前面的的行组合在该表内检查更多的行。

range checked for each record (index map: #):MySQL 没有发现好的可以使用的索引,但发

现如果来自前面的表的列值已知,可能部分索引可以使用。

  • Using filesort:MySQL 需要额外的一次传递,以找出如何按排序顺序检索行。
  • Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
  • Using temporary:为了解决查询,MySQL 需要创建一个临时表来容纳结果。
  • Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。
  • Using sort_union(...), Using union(...), Using intersect(...):
  • index_merge 联接类型合并索引扫描。
  • Using index for group-by:类似于访问表的 Using index 方式,Using index for group-by 表示

MySQL 发现了一个索引,可以用来查 GROUP BY DISTINCT 查询的所有列,而不要

额外搜索硬盘访问实际的表。

 

partitons表示数据来源,来源于数据库的哪一个区。

 

 

 

 

 

二、 MySQL 数据库存储引擎介绍

1 查看 MySQL 数据库中的数据库存储引擎

1.1查看数据库引擎

SHOW ENGINES

 

 

2 MySQL 数据库引擎介绍

2.1ISAM(Indexed Sequential Access Method)

ISAM 是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数

据库被查询的次数要远大于更新的次数。因此,ISAM 执行读取操作的速度很快,而且不占

用大量的内存和存储资源。ISAM 的两个主要不足之处在于,它不支持事务处理,也不能够

容错。如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把 ISAM 用在关键任

务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL 能够支持

这样的备份应用程序。

注意:使用 ISAM 时必须经常备份所有实时数据。

2.2MyISAM

MyISAM MySQL ISAM 扩展格式和缺省的数据库引擎。除了提供 ISAM 里所没有

的索引和字段管理的大量功能,MyISAM 还使用一种表格锁定的机制,来优化多个并发的

读写操作,其代价是你需要经常运行 OPTIMIZE TABLE 命令,来恢复被更新机制所浪费的

空间。MyISAM 还有一些有用的扩展,例如用来修复数据库文件的 MyISAMCHK 工具和用

来恢复浪费空间的 MyISAMPACK 工具。MYISAM 强调了快速读取操作,这可能就是为什

MySQL 受到了 WEB 开发如此青睐的主要原因:在 WEB 开发中你所进行的大量数据操

作都是读取操作。所以,大多数虚拟主机提供商和 INTERNET 平台提供商只允许使用

MYISAM 格式。MyISAM 格式的一个重要缺陷就是不能在表损坏后恢复数据。

注意:MyISAM 引擎使用时必须经常使用 Optimize Table 命令清理空间;必须经常备份

所有实时数据。工具有用来修复数据库文件的 MyISAMCHK 工具和用来恢复浪费空间的

MyISAMPACK 工具。

如果使用该数据库引擎,会生成三个文件:

.frm:表结构信息

.MYD:数据文件

.MYI:表的索引信息

2.3InnoDB

InnoDB 数据库引擎都是造就 MySQL 灵活性的技术的直接产品,这项技术就是 MYSQL++

API。在使用 MYSQL 的时候,你所面对的每一个挑战几乎都源于 ISAM MyISAM 数据库

引擎不支持事务处理(transaction process)也不支持外键。尽管要比 ISAM MyISAM 引擎

慢很多,但是 InnoDB 包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。

如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中

的一个了。

MySQL 官方对 InnoDB 是这样解释的:InnoDB MySQL 提供了具有提交、回滚和崩溃

恢复能力的事务安全(ACID 兼容)存储引擎。InnoDB 锁定在行级并且也在 SELECT 语句

提供一个 Oracle 风格一致的非锁定读,这些特色增加了多用户部署和性能。没有在 InnoDB

中扩大锁定的需要,因为在 InnoDB 中行级锁定适合非常小的空间。InnoDB 也支持 FOREIGNKEY 强制。在 SQL 查询中,你可以自由地将 InnoDB 类型的表与其它 MySQL 的表的类型

混合起来,甚至在同一个查询中也可以混合。

InnoDB 是为处理巨大数据量时的最大性能设计,它的 CPU 效率可能是任何其它基于磁盘

的关系数据库引擎所不能匹敌的。

InnoDB 存储引擎被完全与 MySQL 服务器整合,InnoDB 存储引擎为在主内存中缓存数据

和索引而维持它自己的缓冲池。InnoDB 存储它的表&索引在一个表空间中,表空间可以包

含数个文件(或原始磁盘分区)。这与 MyISAM 表不同,比如在 MyISAM 表中每个表被存

在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为 2GB 的操作系统

上。

innodb myisam 区别

1. InnoDB 支持事务,MyISAM 不支持,对于 InnoDB 每一条 SQL 语言都默认封装成事

务,自动提交,这样会影响速度,所以最好把多条 SQL 语言放在 begin commit 之间,组

成一个事务;

2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM

会失败;

3. InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引

效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,

主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据

文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而

MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度

很快;

5. Innodb 不支持全文索引,而 MyISAM 支持全文索引,查询效率上 MyISAM 要高;(

MySQL5.7 版本中已经支持全文索引)

如何选择:

1. 是否要支持事务,如果要请选择 innodb,如果不需要可以考虑 MyISAM

2. 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请

使用 InnoDB

3. 系统奔溃后,MyISAM 恢复起来更困难,能否接受;

4. MySQL5.5 版本开始 Innodb 已经成为 Mysql 的默认引擎(之前是 MyISAM),说明其优

势是有目共睹的,如果你不知道用什么,那就用 InnoDB,至少不会差。

3 修改数据库级引擎

修改 MySQL my.ini 配置文件

C:\ProgramData\MySQL\MySQL Server 5.7

default-storage-engine=数据库引擎名称

重启 MySQL4 修改表级存储引擎

ALTER TBALE tableName engine=InnoDB

查询表的存储引擎

 

posted @ 2019-09-24 10:42  Eric-Shen  阅读(308)  评论(0编辑  收藏  举报