MySQL小组分享大纲

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

MySQL小组分享大纲

1、连接

1、建立连接
2、验证权限,修改了权限,创建新的连接才会生效。
3、SQL执行的临时内存

2、查询缓存

1、先查询缓存,更新操作会导致所有缓存失效。
2、MySQL 8.0功能去掉

3、分析

词法解析,语法解析

4、优化

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

5、执行

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

更新是如何执行的?

1、日志先行,redo log 和 undo log
2、binlog
3、两阶段提交

MySQL小组分享大纲

事务隔离&多版本控制

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

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小组分享大纲

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

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不带索引。

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;

4、读提交和RR的区别

索引结构

1、树
2、主键索引和普通索引的区别

排序原理

1、全字段排序(sort_buffer,参数:sort_buffer_size)
2、rowid排序(参数:max_length_for_sort_data)
3、例子:

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小组分享大纲

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

2、通过以下语句查看是否使用了文件排序,文件排序一般是归并排序。

SELECT * FROM information_schema.OPTIMIZER_TRACE;

MySQL小组分享大纲

猜你喜欢

转载自blog.51cto.com/janephp/2430655
今日推荐