MySQL小组分享大纲

一、查询语句是如何执行的?

MySQL小组分享大纲

一、链接

一、创建链接
二、验证权限,修改了权限,建立新的链接才会生效。
三、SQL执行的临时内存缓存

二、查询缓存

一、先查询缓存,更新操做会致使全部缓存失效。
二、MySQL 8.0功能去掉ide

三、分析

词法解析,语法解析优化

四、优化

一、决定使用哪一个索引,比方说根据统计信息预估扫描行数,是否使用临时表,需不须要排序等。
二、决定join的各个表的链接顺序3d

五、执行

一、调用引擎接口,查找到第一条符合条件的数据,而后依次查询,返回结果。版本控制

更新是如何执行的?

一、日志先行,redo log 和 undo log
二、binlog
三、两阶段提交日志

MySQL小组分享大纲

事务隔离&多版本控制

一、4种隔离级别
二、可重复读的实现原理,一致性视图
MySQL小组分享大纲
三、例子code

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `k` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into t(id,k) values (1,1),(2,2);

MySQL小组分享大纲

注意:不带索引的更新,会升级为表锁!orm

CREATE TABLE `t1` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `city` varchar(16) NOT NULL,
  `name` varchar(16) NOT NULL,
  `age` int(11) NOT NULL,
  `ext` varchar(10) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `city` (`city`,`name`,`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=9001 DEFAULT CHARSET=utf8

事务1,更新了一条数据,where不带索引。blog

START TRANSACTION with CONSISTENT SNAPSHOT;
update t1 set name = 'test2' where ext = 'test';

事务2,普通查询能够,for update查询被阻塞。排序

select * from t1 where id=4002;
select city,name,age from t1 where id=4002 for update;

四、读提交和RR的区别

索引结构

一、B+树
二、主键索引和普通索引的区别

排序原理

一、全字段排序(sort_buffer,参数:sort_buffer_size)
二、rowid排序(参数:max_length_for_sort_data)
三、例子:

CREATE TABLE `t1` (
  `id` int(11) NOT NULL,
  `city` varchar(16) NOT NULL,
  `name` varchar(16) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `city` (`city`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

select city,name,age from t1 where city='北京' order by name limit 1000;

表中有4000条北京的数据,1000条上海的数据。

MySQL小组分享大纲

一、Using filesort表示会使用排序。

二、经过如下语句查看是否使用了文件排序,文件排序通常是归并排序。

SELECT * FROM information_schema.OPTIMIZER_TRACE;

MySQL小组分享大纲

number_of_tmp_files,表明了使用了几个临时文件。

三、转rowid排序

set max_length_for_sort_data = 16;

MySQL小组分享大纲

使用rowid了排序,这个时候没有使用文件排序,使用临时文件个数为0;

四、增长覆盖索引,就不会再排序了,由于索引默认是有顺序的。
MySQL小组分享大纲

相关文章
相关标签/搜索