手撕Mysql

Mysql基础

说一下 MySQL 执行一条查询语句的内部执行过程?

  • 客户端先通过连接器连接到 MySQL 服务器。
  • 连接器权限验证通过之后,先查询是否有查询缓存,如果有缓存(之前执行过此语句)则直接返回缓存数据,如果没有缓存则进入分析器。
  • 分析器会对查询语句进行语法分析和词法分析,判断 SQL 语法是否正确,如果查询语法错误会直接返回给客户端错误信息,如果语法正确则进入优化器。
  • 优化器是对查询语句进行优化处理,例如一个表里面有多个索引,优化器会判别哪个索引性能更好。
  • 优化器执行完就进入执行器,执行器就开始执行语句进行查询比对了,直到查询到满足条件的所有数据,然后进行返回。

MySQL 提示“不存在此列”是执行到哪个节点报出的?

此错误是执行到分析器阶段报出的,因为 MySQL 会在分析器阶段检查 SQL 语句的正确性。

MySQL 查询缓存的功能有何优缺点?

MySQL 查询缓存功能是在连接器之后发生的,它的优点是效率高,如果已经有缓存则会直接返回结果。 查询缓存的缺点是失效太频繁导致缓存命中率比较低,任何更新表操作都会清空查询缓存,因此导致查询缓存非常容易失效。

如何关闭 MySQL 的查询缓存功能?

MySQL 查询缓存默认是开启的,配置 querycachetype 参数为 DEMAND(按需使用)关闭查询缓存,MySQL 8.0 之后直接删除了查询缓存的功能。

MySQL 的常用引擎都有哪些?

MySQL 的常用引擎有 InnoDB、MyISAM、Memory 等,从 MySQL 5.5.5 版本开始 InnoDB 就成为了默认的存储引擎。

MySQL 可以针对表级别设置数据库引擎吗?怎么设置?

可以针对不同的表设置不同的引擎。在 create table 语句中使用 engine=引擎名(比如Memory)来设置此表的存储引擎。完整代码如下:

1
2
3
4
5
create table student(
id int primary key auto_increment,
username varchar(120),
age int
) ENGINE=Memory

常用的存储引擎 InnoDB 和 MyISAM 有什么区别?

InnoDB 和 MyISAM 最大的区别是 InnoDB 支持事务,而 MyISAM 不支持事务,它们主要区别如下:

  • InnoDB 支持崩溃后安全恢复,MyISAM 不支持崩溃后安全恢复。

  • InnoDB 存储文件有两个,后缀名分别是.frm和.idb,其中.frm是表的定义文件,而idb是数据文件。而Myisam的存储文件有三个,后缀名分别是.frm、.MYD、MYI,其中.frm是表的定义文件,.MYD是数据文件,.MYI是索引文件。但两者都是通过b+树来存储的。

    • Myisam引擎也是采用的B+Tree结构来作为索引结构。由于Myisam中的索引和数据分别存放在不同的文件,所以在索引树中的叶子节点中存的数据是该索引对应的数据记录的地址,由于数据与索引不在一起,所以Myisam是非聚簇索引。
  • InnoDB 支持行级锁,不过行锁是在命中索引的情况下才会起作用。MyISAM 不支持行级锁,只支持到表锁。

  • InnoDB 支持外键,MyISAM 不支持外键。

  • MyISAM由于有单独的索引文件,所以性能比 InnoDB 高。

  • MyISAM 支持 FULLTEXT 类型的全文索引,InnoDB 不支持 FULLTEXT 类型的全文索引,但是 InnoDB 可以使用 sphinx 插件支持全文索引,并且效果更好。

  • InnoDB 主键查询性能高于 MyISAM。、

Count(1)、Count(主键)、Count(*****) 有什么区别?

0%