1 mysql為單程序多執行緒的架構
2 檢視當前資料庫支援的引擎
show engines\g;
3 innodb的後台執行緒有7個,4個io thread,1個master thread,1個鎖,1個錯誤監控執行緒。
show engine innodb status\g;
4 innodb 的記憶體組成:緩衝池,重做日誌緩衝池,額外的記憶體池
show variables like 'innodb_buffer_pool_size'\g;(緩衝池)
show variables like 'innodb_log_buffer_size'\g;重做日誌緩衝池,
show variables like 'innodb_additional_mem_pool_size'\g;
具體看緩衝池的方法:
show engine innodb status\g;
buffer pool and memory
----------------------
total memory allocated 385277496; in additional p
buffer pool size 21632
free buffers 21543
database pages 89
modified db pages 0
pending reads 0
pending writes: lru 0, flush list 0, single page
pages read 89, created 0, written 0
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
no buffer poaol page gets since the last printout
分配的記憶體為21632(buffer pool size表示有多少個緩衝幀)*16(每個buffer frame為16k)/1024=338m,free表
示有多少空閒,database pages表示已使用多少個。modified db pages表示髒頁的數量
5 master thread的工作原理不:每10秒合拼插入緩衝,不是每秒發生,而是判斷當前io壓力去進行,innodb會判斷緩
衝池中的髒頁比例(buf_get_modified_ratio_pct),如果有超過70%的,則刷100個髒頁到磁碟,如果比例小過70%,則
重新整理10%到磁碟
6 double write buffer:由兩部分組成,一部分是記憶體中的double write buffer,大小為2mb,另外的是磁碟上
共享表空間上的連續的128個頁,即兩個區,大小同樣為2mb,當緩衝池髒頁更新時,不寫磁碟,而是通過memcpy 函式
先copy到記憶體中的double write buffer,然後再分2次,每次寫1mb到共享表空間的物理磁碟上,然後再呼叫fsync函式
,同步磁碟。
show global status like 'innodb_dblwr%'\g;
如果innodb_dblwr_pages_writen:innodb_dblwr_writes遠小於64:1,說明磁碟寫入壓力不高
7 mysql中的引數型別,可以設定為當前會話,也可以設定為整個週期
set read_buffer_size=524288;
查全域性 select @@global.read.read_buffer_size\g;
查會話的 select @@sessionread.read_buffer_size\g;
8 慢查詢日誌:
注意,5.1開始,慢查詢以毫秒來計算,
show variables like '%long%';
檢視開關是否開啟
show variables like 'long_slow_queries';
show variable like 'long_query_time';
可以設定乙個開關,當開關on時,如果sql沒用到索引,則把這個語句也記錄下來
show variable like 'long_queries_not_using_indexs';
檢視慢查詢日誌的記錄:
mysqldumpslow ***x.log
5.1開始可以啊慢查詢的日誌記錄放到一張表中:
9 查詢日誌:記錄了所有對資料庫請求的資訊,放在主機名.log檔案中
10 二進位制檔案:
binlog_cache_size:所有未提交的二進位制日誌都會記錄到快取中,等事務提交時再將從緩衝中的寫入到二進位制日
志檔案中,預設為32kb
5.1中,binlog_format引數,可以設定的值有statement(用傳統方式記錄日誌),row(記錄的是表的行更改情況
),如果設定row,可以設定read commited的事務隔離級別,有更好的效能,但磁碟空間增大很多。
1)檢視二進位制日誌檔案
mysqlbinlog --start-position=203 ***x.00004
可以看到sql語句
而如果設定了row後,必須要用
mysqlbinlog --vv --start-position=*** 222.004這樣看更清楚
11)
innodb的預設檔案可以在innodb_data_file_path中設定
[mysqld]
innodb_data_file_path=/db/indabat1:2000m;/db2/innodb:autoextend
指定了用兩個檔案來組成表空間,最好這兩個檔案位於不同的磁碟上。
12) 重做日誌檔案,也有重做日誌檔案組的概念,跟oracle的差不多,可以設定多個組,每個組有兩個檔案,寫完一
個再寫另外乙個。
檢視重做日誌檔案組的方法:show variables like '%innodb%log%'\g;
13) innodb表也是由表空間,段,區,頁,行。段由資料段,索引段,回滾段組成
區由64個連續的頁組成,每個頁16kb,每個區為1mb。每行最多放16kb/2-200行記錄即7992行記錄
14) compact行記錄的格式
變長字段長度列表 null標誌位 記錄頭資訊 列1資料 列2資料。。。
其中null值不佔儲存空間
15) 注意的是,mysql中的varchar65536長度是說所有varchar列的長度總和,如果超出了,則無法建立。
16) mysql中,比如對於not null欄位,如果非要插入非法字段,預設是不提示錯誤的,要提示錯誤的話,
設定sql_mode,即:
set sql_mode='strict_trans_tables';
17 mysql 5.1中每張錶可建6個觸發器,目前只支援for each row的觸發方式
18 mysql 5。1中的分割槽
range分割槽,list,hase分割槽,key分割槽,不論哪種分割槽,當表中有主鍵或唯一索引時,分割槽列必須是唯一索引
的乙個組成部分。
1)range分割槽
create table t(id int) partition by range(id)
( partition p0 values less than(10),partition p1 values less than(20));
檢視分割槽資訊:
select * from information_schema.partitions where table_schema=database() and tablename='t';
注意的是,優化器只能對year(),to_days(),to_second(),unix_timestamp進行優化,而象
year(date)*100+month(date)這些則不會優化。
2)list分割槽
離散值。
3)hash分割槽
partition by hash(year(b))
4)mysql 5.5中,新增加了column分割槽,可以不一定象以前那樣,都是整型的資料,
比如partition p0 values less than ('2009-01-01');
分割槽作在olap上比較好,如果是oltp上的話,除非對主鍵查詢,否則其實會更慢,
有可能。
19) 二叉查詢樹:左子樹比根小,右子數比根大;
平衡二叉樹:任何結點的左右子樹高度最大差為1
b+樹中一般用旋轉代替拆分,增加效率
聚集索引和輔助索引內部都是b+;
聚集索引:葉子結點中存放的是整張表的行記錄;聚集索引的葉節點就是最終的資料節點,而非聚集索引的葉節
仍然是索引節點,但它有乙個指向最終資料的指標。
20)innodb plugin開始,支援快速建立索引的方法,但只對輔助索引起效果,對主鍵的建立和刪除還是需要重新建立
一張表,輔助索引的話,會加s鎖;檢視索引方法
show index from 表名
每列的含義:
non_unique:非唯一的索引
key_name:索引的名
seq_in_index:索引中該列位置
column_name:索引的列
collation:列以什麼方式儲存,b+樹索引總是a
cardinality:表示索引中唯一的數目的估計值,如果非常小,要考慮是否建立索引
sub_part:是否是列的部分被索引,如果索引整個列,則該字段為null
packed:關鍵字如何被壓縮,如果沒被壓縮,則為null
null:是否索引的列包含有null值,
index_type:索引的型別,innodb 中都為b+
分析cardinality時,不大準確,要用analyse tables去多分析,值就準確了
Mysql Innodb技術內幕 1
同步機制 innodb儲存引擎並沒有使用操作吸引自帶的mutex和rw lock,而是自己進行了封裝。並通過spin 自旋 以及 wait arry 等待佇列 的設計來提高效能 重做日誌 物理邏輯日誌 重做日誌 redo log 用來實現事務的永續性。redo log 由兩部分組成 一是記憶體中的重...
mysql InnoDB儲存引擎
innodb的組成部分 1.後台執行緒 2.儲存引擎記憶體池 innodb儲存引擎記憶體緩衝池 1.記憶體緩衝池 innodb是基於磁碟儲存的,並將其中的記錄按照頁的方式進行管理。因此,可將其視為基礎磁碟的資料庫系統。在資料庫系統中,由於cpu速度與磁碟速度之間的紅狗,基於磁碟的資料庫系統通常使用緩...
Mysql Innodb儲存引擎
鎖 參考資料 參考資料 行鎖 innodb的鎖是對索引加鎖,如果查詢到並沒有用到索引就會對錶進行加鎖 record lock 對單條記錄加上鎖 gap lock 間隙鎖,鎖定乙個範圍,但是不包含記錄本身 next key lock record lock gap lock,鎖定乙個方位並鎖定記錄本身...