MySQL 常見問題總結

2021-09-29 21:29:48 字數 3840 閱讀 3792

mysql為什麼會抖一下?

怎麼解決mysql抖動的問題?

什麼是髒頁?

什麼是乾淨頁?

髒頁是怎麼產生的?

什麼是隨機寫?為什麼耗效能?

什麼是順序寫?

wal怎麼把隨機寫轉換為順序寫的?

為什麼刪除表的資料,表檔案大小沒發生改變?

表的資料資訊存在**?

表的結構資訊存在**?

如何刪除表資料後,表檔案資源釋放?

重建表,消除表因為進行大量的增刪改操作而產生空洞,使用如下命令:

1:alter table t engine=innodb;

2:optimize table t(等於 recreate + analyze);

3:truncate table t(等於 drop + create);

analyze table t 其實不是重建表,只是對錶的索引資訊重新統計,沒有修改資料,這個過程中加了mdl讀鎖;

什麼是空洞?如何產生?

什麼是count()語句?

不同的儲存引擎實現方式一樣:

count()效率排序、如何計數?

count(主鍵id)計數:innodb引擎會遍歷整張表,把每一行的id值都取出來,返回給server層。server層拿到id後,判斷不可能為空,就按行累加。從引擎返回的主鍵id會涉及到解析資料行,以及拷貝字段值的操作;

count(1):innodb引擎遍歷整張表,但不取值。server層對於返回的每一行,放乙個數字"1"進去,判斷不可能為空,按行累加;

count(*):並不會把全部字段取出來,而是專門做了優化,不取值。count( *)肯定不是null按行累加;

什麼是幻讀?

如何解決幻讀?

間隙鎖引入什麼問題?

為什麼有kill不掉的語句?

查大量資料,會不會把資料庫記憶體打爆?

什麼場景自增主鍵可能不是連續的?

1.唯一鍵衝突;

2.事務回滾;

3.自增主鍵的批量申請;

自增主鍵的作用?

自增主鍵的儲存機制?

不同的儲存引擎,機制不同:

自增主鍵的修改機制?

在mysql裡面,如果欄位id被定義為auto_increment,在插入一行資料的時候,自增值的行為如下:

1.如果插入資料時,id欄位指定為0、null或者未指定值,那麼把這個表當前的auto_increment值填到自增欄位;

2.如果插入資料時id欄位,指定了具體的值,就直接使用語句裡指定的值;

插入值跟當前自增值的關係:

根據要插入的值和當前自增值的大小關係,自增值的變更結果也會有所不同。假設,某次要插入的值是x,當前的自增值是y。

1:如果 x < y,那麼這個表的自增值不變;

2:如果 x ≥ y,那就需要把當前自增值修改為新的自增值;

兩表之間拷貝資料用什麼方法,有什麼注意事項?

1.使用insert…select 兩表之間拷貝資料:

需要注意,可重複讀隔離級別下,這個語句會給select的表裡掃瞄到的記錄和間隙加讀鎖;

如果insert…select 的物件是同乙個表,有可能會造成迴圈寫入。這種情況下,我們需要引入使用者臨時表來做優化;

insert 語句如果出現唯一鍵衝突,會在衝突的唯一值上加共享的next-key lock(s鎖)。如果碰到由於唯一鍵約束導致報錯後,要盡快提交或回滾事務,避免加鎖時間過長;

2.匯出成execl,然後拼sql成insert into values(),(),()形成,進行批量插入再;

3.多個執行緒分到幾個任務執行,比如十個執行緒,每個執行緒10條記錄,插入後,再查詢新的100條記錄處理;

怎麼最快地複製一張表?

1.物理拷貝的方式速度最快,尤其是對大表拷貝來說是最快的方法;如果出現誤刪表的情況,用備份恢復出,誤刪之前的臨時庫,然後再把臨時庫中的表拷貝到生產庫上,是恢復資料最快的方法。但是也會有一定的侷限性:

2.使用mysqldump生成包含insert語句檔案的方法,可以在where引數增加過濾條件,來實現只匯出部分資料。這個方式不足之處,不能使用join這種比較複雜的where條件寫法;

3.用select … into outfile 的方法是最靈活的,支援所有的sql寫法。但這個方法的缺點就是,每次只能匯出一張表的資料,而且表結構也需要另外的語句單獨備份;

後兩種方式都是邏輯備份方式,是可以跨引擎使用的。

物理拷貝表的功能:

檢視當前mysql資料檔案所存放的位置:

mysql> show global variables like "%datadir%";+

----

----

-------

+------

----

----

----

----

----

----

----

----

-------

+| variable_name | value |+--

----

----

-----+

----

----

----

----

----

----

----

----

----

----

-----+

| datadir |

c:\programdata\mysql\mysql server 5.7\data\ |+--

----

----

-----+

----

----

----

----

----

----

----

----

----

----

----

-+

在mysql5.6版本引入了可傳輸表空間的方法,可以通過匯出 + 匯入表空間的方式,實現物理拷貝表的功能;

舉個栗子:

假設目標在db1庫下,複製乙個跟表t相同的表r,具體執行步驟如下:

執行create table r like t;   建立乙個相同表結構的空表;

執行alter table r discard tablespace; 這時候r.ibd檔案會被刪除;

執行flush table t for

export

; 這時候db1目錄下會生成乙個t.cfg檔案;

在db1目錄下執行 cp t.cfg r.cfg; cp t.ibd r.ibd;

這兩個命令

(拷貝得到兩個檔案,

mysql進行要有讀寫許可權)

;執行unlock tables; 這時候t.cfg 檔案會被刪除;

執行alter table r import tablespace; 將這個r.ibd 檔案作為表r的新的表空間, 由於檔案的資料內容和t.ibd是相同的,所以表r中就有了和表t相同的資料;

1.在對被驅動表做全表掃瞄的時候,如果資料沒有在buffer pool中,就需要等待這部分資料從磁碟讀入;

從磁碟讀入資料到記憶體中,會影響正常業務的buffer pool命中率,而且這個演算法天然會對被驅動表的資料做多次訪問,更容易將這些資料頁放到buffer pool的頭部;

2.即使被驅動表資料都在記憶體中,每次查詢"下乙個記錄的操作",都是類似指標操作。而join_buffer中是陣列,遍歷的成本更低;

bnl演算法的效能會更好;

Mysql常見問題

1.安裝,推薦使用非安裝版.把解壓後的檔案拷貝到c盤根目錄下,並把總目錄改為mysql.然後進入windows命令 控制台,在c mysql bin下面執行mysqld nt install把它安裝為乙個服務,然後呼叫net start mysql啟動它,停止的命令是net stop mysql 想...

mysql常見問題

按照表中某一欄位排序,若該字段可能存在空值,公升序排列時空值排在最前面,降序排列是空值排在最後面。公升序排列時如果想讓空值排在最後面,可以 order by field1 is null,field1 asc 這麼寫。例如有個user表,按照 seq欄位排序。select from user ord...

MySQL常見問題

事務是指作為單個邏輯工作單元的一系列操作 一系列sql語句 當多個事務併發地訪問資料庫時就會產生同時讀取和 或修改同一資料的情況。若對併發操作不加控制就可能會訪問和儲存不正確的資料 髒讀 非重複讀 幻像讀 丟失修改的異常情況 破壞資料庫的一致性。a向b支付50 讀出a支付寶餘額 100 a支付寶扣錢...