Mysql学习(基础篇)

一.一条SQL语句在MySQL中如何执行的?
客户端请求 --->连接器(验证身份,给予权限)-->查询缓存(存在则直接返回),不存在则执行后续操作 ---> 分析器(对sql进行词法分析和语句分析操作) --->优化器(主要对执行的sql优化选择最优的执行方法)--->执行器(执行时会看用户是否有执行权限,有才去使用这个引擎提供的接口)

二.说说Mysql有哪些存储引擎,都有哪些区别?
一个数据库中多个表可以使用不同引擎以班组各种性能和实际需求

-- 查看支持的存储引擎
SHOW ENGINES

-- 查看默认存储引擎
SHOW VARIABLES LIKE 'storage_engine'

常见的存储引擎就 InnoDB,MyISAM,Memory,NDB。
InnoDB现在是Mysql默认的存储引擎,支持事务,行锁和外键

文件存储结构对比

MyISAM 物理文件结构为:
 .frm文件:与表相关的元数据信息都存放在frm文件,
 .MYD(MyData) 文件:MyISAM存储引擎专用,用于存储MyISAM的表的数据
 .MYI(MyIndex)文件:MyISAM存储引擎专用,用于存储MyISAM表的索引的相关信息

 InnoDB 物理文件结构为:
 .frm文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等

 .ibd文件或.ibdata文件:这两种文件都是存放InnoDB数据的文件,之所有有两种形式存放InnoDB的数据,是因为InnoDB的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是用独享表空间存放存储数据。

 独享表空间存储方式使用.ibd文件 并且每个表一个.ibd文件,共享表空间存储方式使用.ibdata文件,所有表共同使用一个.ibdata文件(或多个,可以自己配置)

 InnoDB支持事务,MyISAM不支持事务,
 InnoDB支持外键,而MyISAM不支持,
 InnoDB是聚簇索引,MyISAM是非聚簇索引
 聚簇索引的文件存放在主键索引的叶子节点上,因此InnoDB必须要有主键但是辅助索引需要进行两次查询,第一次查到护肩,然后再通过主键查询到数据,因此主键不应该过大
 InnoDB不保存表的具体函数, 执行select count(*) from table 需要扫描全表。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可。

 三.一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 ?

 如果表的类型是MyISAM,那么是18,因为MyISAM表会把自增主键的最大ID 记录到数据文件中,重启Mysql自增主键的最大ID也不会丢失
 如果表的类型是InnoDB,那么是15。因为InnoDB 表只是把自增主键的最大ID记录到内存中,所以重启数据库或对表进行OPTION操作,都会导致最大ID丢失。

四.哪个存储引擎执行 select count(*) 更快,为什么?

MyISAM更快,因为MyISAM内部维护了一个计数器,可以直接调取。

在MyISAM存储引擎中,把表的总行数存储在磁盘上,当执行select count(*) from t时,直接返回总数居。

在InnoDB存储引擎中,跟MyISAM不一样,没有将总行数存储在磁盘上,是一行一行的累加,最后返回总数量。

那为什么InnoDB引擎不想MyISAM引擎一样,将总行数存储得到磁盘上,这个InnoDB的食物性有关,由于多版本并发控制(MVCC)的原因

CHAR 和 VARCHAR 的区别?

char是固定长度,varchar长度可变

存储时,前者不管实际存储数据的长度,直接按char规定的长度分配,而后者会根据实际存储的数据分配最终的存储空间。

超过char,varchar最大长度n的限制后,字符串会被截断。

能存储的最大空间限制不一样:char的存储上线为255字节。

char在存储时会阶段为不的空格,而varchar不会。

 

おすすめ

転載: blog.csdn.net/Chen_leilei/article/details/112344669