MySQL小组分享大纲
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL小组分享大纲相关的知识,希望对你有一定的参考价值。
1、查询语句是如何执行的?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、两阶段提交
事务隔离&多版本控制
1、4种隔离级别
2、可重复读的实现原理,一致性视图
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);
注意:不带索引的更新,会升级为表锁!
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、B+树
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条上海的数据。
1、Using filesort表示会使用排序。
2、通过以下语句查看是否使用了文件排序,文件排序一般是归并排序。
SELECT * FROM information_schema.OPTIMIZER_TRACE;
number_of_tmp_files,代表了使用了几个临时文件。
3、转rowid排序
set max_length_for_sort_data = 16;
使用rowid了排序,这个时候没有使用文件排序,使用临时文件个数为0;
4、增加覆盖索引,就不会再排序了,因为索引默认是有顺序的。
以上是关于MySQL小组分享大纲的主要内容,如果未能解决你的问题,请参考以下文章