1. 程式人生 > >Mysql系列常見面試題(四)

Mysql系列常見面試題(四)

常見面試題 不同的 多少 內部 n) set 語句 變更 upd

1.表中有大字段X(例如text類型),且字段X不會經常更新,以讀為主,將該字段拆成子表好處是什麽?

:如果字段裏面有大字段(text,blob)類型的,而且這些字段的訪問並不多,這時候放再一起就變成了缺點了。Mysql數據庫的幾率存儲時按行存儲的,數據塊大小又是固定的16K,每條幾率越小,相同的存儲的記錄就越多。此時應該把大字段拆走,這樣應付大部分小字段查詢時,就能提高效率。當需要查詢大字段時候,此時關聯查詢是不可避免的,但也是值得的,拆分開後,對字段的UPDAE就要UPDATE多個表了。

2.Mysql中InnoDB引擎的行鎖通過加在什麽上完成,或者實現的,

InnoDB行鎖,通過給所有上的索引項加鎖來實現的,這一點MySQL與Oracle不同,後者是通過在數據塊中對相應數據行加鎖實現的,InnoDB這種行鎖實現特點意味著;只有通過索引條件檢索數據,InnoDB才使用行級鎖,否則InnoDB將使用表級鎖。

3.Mysql中控制內存分配的全景參數,有哪些?

1.Keybuffersize 2.innodbbufferpool_size 3.querycachesize 4.readbuffersize
詳解:1. Keybuffersize> * keybuffersize 指定索引緩沖區的大小,
它決定索引處理的速度,尤其是索引讀的速度。通過檢查狀態值
Keyreadrequests Keyreads,可以知道 keybuffersize 設置是否
合理。比例 keyreads /keyreadrequests 應該盡可能的低,至少是
1:1001:1000 更好(上述狀態值可以使用 SHOW STATUS LIKE

‘keyread%‘獲得)。 > * keybuffersize 只對 MyISAM 表起作用。
即使你不使用 MyISAM 表,但是內部的臨時磁盤表是 MyISAM 表,也
要使用該值。可以使用檢查狀態值 createdtmpdisktables 得知詳情。
對於 1G 內存的機器,如果不使用 MyISAM 表,推薦值是 16M8-
64M> * keybuffersize 設置註意事項 >>>1. 單個 keybuffer
大小不能超過 4G,如果設置超過 4G,就有可能遇到下面 3
bug: >>>>> http://bugs.mysql.com/bug.php?id=29446 <br
/> >>>>> http://bugs.mysql.com/bug.php?id=29419 <br
/> >>>>> http://bugs.mysql.com/bug.php?id=5731 <br
/> >>>2. 建議 keybuffer 設置為物理內存的 1/4(針對 MyISAM
),甚至是物理內存的 30%~40%,如果 keybuffersize 設置太大,
系統就會頻繁的換頁,降低系統性能。因為 MySQL 使用操作系統的緩
存來緩存數據,所以我們得為系統留夠足夠的內存;在很多情況下數據
要比索引大得多。 >>>3. 如果機器性能優越,可以設置多個
keybuffer,分別讓不同的 keybuffer 來緩存專門的索引
2. innodbbufferpool_size > 表示緩沖池字節大小, InnoDB 緩存
表和索引數據的內存區域。 mysql 默認的值是 128M。最大值與你的
CPU 體系結構有關,在 32 位操作系統,最大值是 4294967295
(2^32-1) ,在 64 位操作系統,最大值為
18446744073709551615 (2^64-1)> 32 位操作系統中,
CPU 和操作系統實用的最大大小低於設置的最大值。如果設定的緩沖池
的大小大於 1G,設置 innodbbufferpoolinstances 的值大於 1. > *
數據讀寫在內存中非常快, innodbbufferpoolsize 減少了對磁盤的讀
寫。 當數據提交或滿足檢查點條件後才一次性將內存數據刷新到磁盤
中。然而內存還有操作系統或數據庫其他進程使用, 一般設置 buffer
pool 大小為總內存的 3/4 4/5。 若設置不當, 內存使用可能浪費
或者使用過多。 對於繁忙的服務器, buffer pool 將劃分為多個實例以
提高系統並發性, 減少線程間讀寫緩存的爭用。 buffer pool 的大小首
先受 innodbbufferpool_instances 影響, 當然影響較小。
3. querycachesize > mysql 接收到一條 select 類型的 query
時, mysql 會對這條 query 進行 hash 計算而得到一個 hash 值,然後
通過該 hash 值到 query cache 中去匹配,如果沒有匹配中,則將這個
hash 值存放在一個 hash 鏈表中,同時將 query 的結果集存放進
cache 中,存放 hash 值的鏈表的每一個 hash 節點存放了相應 query
結果集在 cache 中的地址,以及該 query 所涉及到的一些 table 的相
關信息;如果通過 hash 值匹配到了一樣的 query,則直接將 cache
相應的 query 結果集返回給客戶端。如果 mysql 任何一個表中的任何
一條數據發生了變化,便會通知 query cache 需要與該 table 相關的
query cache 全部失效,並釋放占用的內存地址。 > query cache
優缺點 >> 1. query 語句的 hash 計算和 hash 查找帶來的資源消
耗。 mysql 會對每條接收到的 select 類型的 query 進行 hash 計算然
後查找該 query cache 是否存在,雖然 hash 計算和查找的效率已
經足夠高了,一條 query 所帶來的消耗可以忽略,但一旦涉及到高並
發,有成千上萬條 query 時, hash 計算和查找所帶來的開銷就的重視
了; >> 2. query cache 的失效問題。如果表變更比較頻繁,則會造
query cache 的失效率非常高。表變更不僅僅指表中的數據發生變
化,還包括結構或者索引的任何變化; >> 3. 對於不同 sql 但同一結
果集的 query 都會被緩存,這樣便會造成內存資源的過渡消耗。 sql
字符大小寫、空格或者註釋的不同,緩存都是認為是不同的 sql(因為
他們的 hash 值會不同); >> 4. 相關參數設置不合理會造成大量內
存碎片,相關的參數設置會稍後介紹。
4. readbuffersize >MySQL 讀入緩沖區大小。對表進行順序掃描
的請求將分配一個讀入緩沖區, MySQL 會為它分配一段內存緩沖區。
readbuffersize 變量控制這一緩沖區的大小。如果對表的順序掃描請求
非常頻繁,並且你認為頻繁掃描進行得太慢,可以通過增加該變量值以
及內存緩沖區大小提高其性能
4.若一張表中只有一個字段varchar(N)類型,utf8編碼,則N最大值為多少()?
由於utf8的每個字符最多占用三個自己,而Mysql定義行的長度不能超過65535,因此N的最大值計算方法為,

(65595-1-2)/3。減去1的原因是實際存儲從第二個字節開始,減去2的原因是因為要在列表長度存儲的實際長度,除以3是因為utf8限制

每個字符,最多占用三個字節。(max:21844)

5.select * 和select 全部字段 的兩種寫法有何優缺點?

5.1:前者要解析數據字典,後者不需要。

5.2:結果輸出順序,前者與建表列順序相同,後者按指定字段順序。

5.3:表字段改名,前者不需要修改,後者需要改。

5.4:後者可以建立索引進行優化,前者無法優化

5.5:後者的可讀性比前者要高。

6.HAVNG子句和where的異同點?

6.1:語法上:where用表中列名,having用select結果別名

6.2:影響結果範圍:where從表讀出數據的行數,having返回客戶端的行數

6.3索引:where可以使用索引,having不能使用索引,只能在臨時結果集操作

6.4 where後面不能使用聚集函數,having是專門使用聚集函數的。

7.Mysql當記錄不存在時insert,當記錄存在時update,語句怎麽寫?

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
8.MySQL insert update select 語句語法
`SQL insert into student (stuid,stuname,deptid) select 10,‘xzm‘,3
from student where stuid > 8;
update student a inner join student b on b.stuID=10 set
a.stuname=concat(b.stuname, b.stuID) where a.stuID=10 ;

Mysql系列常見面試題(四)