一、 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、const、

eq_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 查询的所有列,而不要

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

二、 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

查询表的存储引擎

转载于:https://www.cnblogs.com/EricShen/p/11576965.html

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

  1. mysql查询主键sql语句_MySQL数据库-表操作-SQL语句(一)

    1. 数据库操作与存储引擎 1.1   数据库和数据库对象 数据库对象:存储,管理和使用数据的不同结构形式,如:表.视图.存储过程.函数.触发器.事件等. 数据库:存储数据库对象的容器. 数据库分两种 ...

  2. MySQL 数据库存储引擎介绍

    文章目录 一.存储引擎概念介绍 二.MyISAM 存储引擎 1. MyISAM 简介 2. MyISAM 表支持 3 种不同的存储格式 (1) 静态(固定长度)表 (2) 动态表 (3) 压缩表 3. ...

  3. 55:Mysql用户管理|常用sql语句|mysql数据库备份恢复

    2019独角兽企业重金招聘Python工程师标准>>> 1.Mysql用户管理: 场景,为了安全,新建的站点,创建新的用户,或者给已有用户授权,对某个库或者某个表有权限: 语法: g ...

  4. c# mysql executenonquery_C# 直接使用sql语句对数据库操作 (cmd.ExecuteNonQuery)

    只介绍读和删 不管使用什么方法来对数据库进行操作都绕不开和数据库的连接问题,所以咱们先在App.config中添加连接字段 随后读取该字段,需要用到 System.Configuration.dll, ...

  5. 18.sql server横向切分、纵向拆分表、相对平均分配数据、复杂sql语句、数据库存储原理(by-朝夕)

    Database 数据库分库分表 1.横向切分 分库分表案例 需要定义规则来选择表 查询: 规则: 2.纵向拆分表 3.相对平均分配数据 复杂Sql语句 一条Sql语句执行的全过程: 你们觉得数据库是 ...

  6. vb mysql 查询_vb中用sql语句查询数据库

    给你个完整的吧.Dim rs1 As New ADODB.Recordset   '定义数据集对象 Dim cnn As New ADODB.Connection     '定义数据连接 Privat ...

  7. mysql创建用户表的sql语句,mysql创建表的sql语句

    mysql 动态sql语句,如何用一款小工具大大加速MySQL SQL语句优化(附源,mysql分页查询sql语句,mysql创建表的sql语句 mysql建表语句_计算机软件及应用_IT/计算机_专 ...

  8. mysql 主库innodb从库myisam_MySQL的两种常用数据库存储引擎:MyISAM与InnoDB

    问题1:MySQL的data里的网站数据库里只有.frm 而没有.MYD和.MYI文件? 解释:首先排除误删的情况,那么,你的此数据库的存储引擎可能为innoDB类型(把数据库导入为.sql后,可以在 ...

  9. MySQL数据库https接口_第三章 mysql 数据库接口程序以及SQL语句操作

    mysql  数据库接口程序以及SQL语句操作 用于管理数据库: 命令接口自带命令 DDL:数据定义语言(create drop ) DCL: 数据控制语言(grant revoke) DML: 数据 ...

最新文章

  1. Java反射实践:从反射中理解class
  2. 内表数据写到服务器上
  3. 博士学位论文 | 机器阅读理解与文本问答技术研究
  4. sql server:删除表数据,标识列Id从1开始
  5. 数据结构实验二:迷宫的求解
  6. 并行编程2——多核体系架构
  7. Oracle为JDK 8寻求社区参与
  8. Dynamipsgui入门教程
  9. Tomcat版本与Servlet、JSP等版本的支持关系
  10. python 格式化输出
  11. Mybatis中#{}与${}的使用
  12. c语言程序设计abcd拍大小,《C语言程序设计》选择、填空。热门考题
  13. iOS开发之将base64位编码的字符串转换为图片,data转图片,图片转data
  14. NOIP-质因数分解
  15. 如何在电脑上安装虚拟机和系统。全网最全教程,不接受反驳。
  16. Android 安卓开发板 读取串口
  17. mysql 主键 默认索引_mysql 主键和默认 设为索引的规则
  18. Word安全警告 宏已被禁用解决
  19. Python爬虫新手教程:微医挂号网医生数据抓取!
  20. 格式工厂 wav 比特率_【资源分享】格式工厂FORMAT FACTORY-5.1.0

热门文章

  1. 参数构造错误 微信_快速掌握前端开发中的常见错误
  2. ideal连接数据库报错The server time zone value ‘�й���׼ʱ��’ is unrecognized or represents more than one time
  3. 网络推广是做什么的介绍网站内容更新时需要遵循哪些原则?
  4. 外包网络推广公司浅析想保持稳定的SEO排名和流量,需要做什么呢?
  5. 404页面设计技巧性分享不容错过!
  6. python画蝴蝶_python画蝴蝶曲线图的实例
  7. xcopy 跳过已经存在的_《天官赐福》舍不得跳过的片头片尾,无别,不散唱出花城心声...
  8. linux定时备份mysql_linux定时备份MySQL数据库并删除七天前的备份文件
  9. 开发日记-20190906 关键词 当当云阅读 ipad
  10. 日志文件列表 读书笔记《Linux 系统管理技术手册(第二版)》