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小組分享大綱

相關文章
相關標籤/搜索