MySQL 执行一条查询语句的内部执行过程?
1.客户端先通过连接器连接到Mysql服务器。
2.连接器权限验证通过之后,先查询是否有查询缓存。若之前执行过此语句有缓存,则直接返回缓存数据,否则直接进入分析器。
3.分析器会对查询语句进行语法分析和词法分析,判断SQL语法是否正确。如果查询语法错误就直接返回错误信息给客户端。若语法正确则进入优化器。
4.优化器对查询语句进行优化处理,例如一个表中包含多个索引,优化器会判别哪个索引性能更好。
5.优化器执行完就进入执行器,执行器就开始执行语句进行查询比对,直到满足条件的所有数据查询完毕,然后返回数据。
MySQL 提示“不存在此列”是执行到哪个节点报出的?
此错误是执行到分析器阶段,因为Mysql在此阶段会检查SQL语句的正确性。
MySQL 查询缓存的功能有何优缺点?
MySQL查询缓存功能是在连接器链接MySQL服务器之后发生的。
优点:效率高,如果有缓存则直接返回缓存数据。
缺点:失效太频繁导致缓存命中率比较低,任何更新表操作都会清空查询缓存,因此导致查询缓存非常容易失效。
如何关闭 MySQL 的查询缓存功能?
MySQL 查询缓存默认是开启的,配置 querycachetype 参数为 DEMAND(按需使用)关闭查询缓存。
MySQL 8.0 之后直接删除了查询缓存的功能。
MySQL 可以针对表级别设置数据库引擎吗?怎么设置?
可以针对不同的表设置不同的引擎。在 create table 语句中使用 engine=引擎名(比如Memory)来设置此表的存储引擎。
完整代码如下:
create table student(
id int primary key auto_increment, username varchar(120), age int ) ENGINE=Memory
MySQL 的常用引擎都有哪些?
MySQL 的常用引擎有 InnoDB、MyISAM、Memory 等。
MySQL 5.5.5 版本开始 InnoDB 就成为了默认的存储引擎
常用的存储引擎 InnoDB 和 MyISAM 有什么区别?
InnoDB 和 MyISAM 最大的区别是InnoDB 支持事务,而 MyISAM 不支持事务。
主要区别:
1.InnoDB 支持崩溃后安全恢复,MyISAM 不支持崩溃后安全恢复。
2.InnoDB 支持行级锁,MyISAM 不支持行级锁,只支持到表锁。
3.InnoDB 支持外键,MyISAM 不支持外键。
4.MyISAM 性能比 InnoDB 高。
5.MyISAM 支持 FULLTEXT 类型的全文索引,InnoDB 不支持 FULLTEXT 类型的全文索引,但是 InnoDB 可以使用 sphinx 插件支持全文索引,并且效果更好。
6.InnoDB 主键查询性能高于 MyISAM。
InnoDB 有哪些特性?
1.插入缓冲(insert buffer):对于非聚集索引的插入和更新,不是每一次直接插入索引页中,而是首先判断插入的非聚集索引页是否在缓冲池中,如果在,则直接插入,否则,先放入一个插入缓冲区中。好似欺骗数据库这个非聚集的索引已经插入到叶子节点了,然后再以一定的频率执行插入缓冲和非聚集索引页子节点的合并操作,这时通常能将多个插入合并到一个操作中,这就大大提高了对非聚集索引执行插入和修改操作的性能。
2.两次写(double write):两次写给 InnoDB 带来的是可靠性,主要用来解决部分写失败(partial page write)。doublewrite 有两部分组成,一部分是内存中的 doublewrite buffer ,大小为 2M,另外一部分就是物理磁盘上的共享表空间中连续的 128 个页,即两个区,大小同样为 2M。当缓冲池的作业刷新时,并不直接写硬盘,而是通过 memcpy 函数将脏页先拷贝到内存中的 doublewrite buffer,之后通过 doublewrite buffer 再分两次写,每次写入 1M 到共享表空间的物理磁盘上,然后马上调用 fsync 函数,同步磁盘。如下图所示:
3.自适应哈希索引(adaptive hash index):由于 InnoDB 不支持 hash 索引,但在某些情况下 hash 索引的效率很高,于是出现了 adaptive hash index 功能, InnoDB 存储引擎会监控对表上索引的查找,如果观察到建立 hash 索引可以提高性能的时候,则自动建立 hash 索引。
一张自增表中有三条数据,删除了两条数据之后重启数据库,再新增一条数据,此时这条数据的 ID 是几?
如果这张表的引擎是 MyISAM,那么 ID=4,如果是 InnoDB 那么 ID=2(MySQL 8 之前的版本)。
MySQL 中什么情况会导致自增主键不能连续?
以下情况会导致 MySQL 自增主键不能连续:
唯一主键冲突会导致自增主键不连续
事务回滚也会导致自增主键不连续