面試筆記 資料庫

2021-09-12 03:36:49 字數 4810 閱讀 9405

資料庫引擎

mysql常用的儲存引擎包括innodb和myisam以及memory引擎

innodb更適合處理大量的高併發的資料,因為其良好的事務日誌和故障恢復處理。資料庫的大小決定了故障的恢復時間的長短,這會比較快,但是myisam會需要幾個小時

需要外來鍵處理,那你就要選擇innodb,如果需要全文索引,那麼myisam可能是乙個比較好的選擇,因為系統內建了這個全文的索引

myisam引擎:

使用場景:

innodb引擎:

適用場景:

查詢優化

scheme設計與資料型別優化

建立高效能索引

索引相關的資料結構和演算法

避免建立臨時表,消耗效能

選取最適用的字段屬性

使用連線(join)來代替子查詢(sub-queries)

使用聯合(union)來代替手動建立的臨時表

事務鎖定表

分表技術(水平分割、垂直分割)

新增適當索引(index) [四種: 普通索引、主鍵索引、唯一索引unique、全文索引];全文索引,主要是針對對檔案,文字的檢索, 比如文章, 全文索引針對myisam有用.

優化的查詢語句

任何地方都不要使用select * from user ,使用具體的字段列來代替"*".不要返回用不到的任何字段。

盡量使用表變數來代替臨時表,如果表變數包含大量資料,請注意索引非常有限(只有主鍵索引)

避免頻繁建立和刪除臨時表,以減少系統表資源消耗

如果使用到了臨時表,在儲存過程的最後務必將所有臨時表顯示刪除,先truncate table,然後 drop table.這樣可以避免系統表的較長時間鎖定

盡量避免使用游標,因為游標的效率較差,如果游標操作的資料超過一萬行,那麼就應該考慮改寫了。

所有的儲存過程和觸發器的開始處設定 set nocount on ,在結束時設定 set nocount off 。無需在執行儲存過程和觸發器的每個語句後向客戶端傳送done_in_proc 訊息。

盡量避免大事務操作,提高系統併發能力。盡量避免大事務操作,提高系統併發能力。

盡量避免向客戶端返回大資料量,若資料量過大,應該考慮相應需求是否合理

讀寫[寫: update/delete/add]分離

儲存過程 [模組化程式設計,可以提高速度]

對mysql配置優化 [配置最大併發數my.ini, 調整快取大小 ]

mysql伺服器硬體公升級

定時的去清除不需要的資料,定時進行碎片整理(myisam)

sql語句本身的優化

在group by 後面增加 order by null 就可以防止排序.

mybatis

mybatis提供了一級快取的方案來優化在資料庫會話間重複查詢的問題。實現的方式是每乙個sqlsession中都持有了自己的快取,一種是session級別,即在乙個mybatis會話中執行的所有語句,都會共享這乙個快取。一種是statement級別,可以理解為快取只對當前執行的這乙個statement有效。

在二級快取的使用中,乙個namespace下的所有操作語句,都影響著同乙個cache,即二級快取是被多個sqlsession共享著的,是乙個全域性的變數。

當開啟快取後,資料的查詢執行的流程就是 二級快取 -> 一級快取 -> 資料庫。

臨時表當工作在非常大的表上時,你可能偶爾需要執行很多查詢獲得乙個大量資料的小的子集,不是對整個表執行這些查詢,而是讓mysql每次找出所需的少數記錄,將記錄選擇到乙個臨時表可能更快些,然後在這些表執行查詢。

在建立臨時表時,如果一次性插入資料量很大,那麼可以使用select into 語句來代替create table,避免造成大量log日誌,以提高速度;如果資料量不大,為了緩和系統表的資源,應先create table,然後 insert.

create temporary table tmp_table (

name varchar(10) not null,

value integer not null

)

如果你宣告臨時表是乙個heap表,mysql也允許你指定在記憶體中建立它:

create temporary table tmp_table (

name varchar(10) not null,

value integer not null

) type = heap

sql

insert into select語句 複製表 select vale1, value2 into table2 from table1

要求目標表table2必須存在

select into from 語句形式為:select vale1, value2 into table2 from table1

要求目標表table2不存在,因為在插入時會自動建立表table2,並將table1中指定字段資料複製到table2中

group by 的 with rollup 是用來在分組統計資料的基礎上再進行統計彙總,即用來得到group by的彙總資訊;with rollup 子句的 group by 語句時,不能再使用 order by 語句對結果集進行排序,如果對返回的結果順序不滿意,需要應用程式獲得結果後在程式中進行排序

count count(*)自動會優化指定到那乙個字段,count(1)對應第乙個字段,count(colum) 排除為空

like

優化:1.%號不放最左邊(放在左邊無法識別具體字段,索引無法使用);2.使用復合索引

替換:select `column` from `table` where locate(『keyword』, `condition`)>0

select `column` from `table` where position(『keyword』 in `condition`)

select `column` from `table` where instr(`condition`, 『keyword』 )>0

instr(title,『name』)>0 相當於 title like 『%name%』

instr(title,『name』)=1 相當於 title like 『name%』

instr(title,『name』)=0 相當於 title not like 『%name%』

字段索引

查詢sql

公升級硬體

讀寫分離 快取

快取可以發生在這些層次:

資料訪問層:比如mybatis針對sql語句做快取,而hibernate可以精確到單個記錄,這裡快取的物件主要是持久化物件persistence object

web層:針對web頁面做快取

瀏覽器客戶端:使用者端的快取

表分割槽分割槽的好處是:

分割槽的型別:

分割槽適合的場景有:

垂直拆分

垂直拆分的優點是:

缺點是:

drop、truncate和delete的區別

delete語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中儲存以便進行進行回滾操作。

truncate table 則一次性地從表中刪除所有的資料並不把單獨的刪除操作記錄記入日誌儲存,刪除行是不能恢復的。並且在刪除的過程中不會啟用與表有關的刪除觸發器。執行速度快。

truncate 和delete只刪除資料,drop則刪除整個表(結構和資料)

truncate、drop是dll(data define language),操作立即生效,原資料不放到 rollback segment中,不能回滾;delete語句為dml(data maintain language),這個操作會被放到 rollback segment中,事務提交後才生效。如果有相應的 tigger,執行的時候將被觸發。

truncate table 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。如果想保留標識計數值,請改用 delete。如果要刪除表定義及其資料,請使用 drop table 語句。

外來鍵mysql中「鍵」和「索引」的定義相同,所以外來鍵和主鍵一樣也是索引的一種

索引對於復合索引,在查詢使用時,最好將條件順序按找索引的順序,這樣效率最高; select * from table1 where col1=a and col2=b and col3=d 如果使用 where col2=b and col1=a 或者 where col2=b 將不會使用索引;乙個查詢可以只使用索引中的一部份,但只能是最左側部分。

索引的缺點:

占用磁碟空間。

增加了插入和刪除的操作時間。乙個表擁有的索引越多,插入和刪除的速度越慢。如 要求快速錄入的系統不宜建過多索引

下面是一些常見的索引限制問題

使用不等於操作符(<>, !=);通過把用 or 語法替代不等號進行查詢,就可以使用索引,以避免全表掃瞄

mysqlcluster

管理節點(mgm):這類節點的作用是管理mysqlcluster內的其他節點,如提供配置資料,並停止節點,執行備份等。由於這類節點負責管理其他節點的配置,應該在啟動其他節點之前啟動這類節點。mgm節點是用命令「ndb_mgmd」啟動的;

資料節點(ndb):這類節點用於儲存cluster的資料,資料節點的數目與副本的數目相關,是片段的倍數。例如,對於兩個副本,每個副本有兩個片段,那麼就有4個資料節點,沒有必要設定過多的副本,在ndb中資料會盡量的儲存在記憶體中。資料節點使用命令「ndb」啟動的;

sql節點:這是用來訪問cluster資料的節點,對於mysql cluster,客戶端節點是使用ndb cluster儲存引擎的傳統mysql伺服器。通常,sql節點使用命令「mysqld-ndbcluster」啟動的;

面試筆記 資料結構 單鏈表

可以通過下面的 定義乙個單鏈表 typedef struct node lnode,linklist 這裡使用typedef將結構體struct node定義為lnode型別,表示鍊錶中每個結點的型別為lnode,它等價於結構體型別struct node。另外,linklist是指向lnode型別的...

資料庫筆記(資料庫操作)

1.windows系統下 資料庫啟動 net start mysql2.連線與斷開伺服器 mysql h 位址 p 埠 u 使用者名稱 p 密碼3.檢視當前資料庫 select database 4.顯示當前時間,使用者名稱,資料庫版本 select now user version 5.建立庫 1...

面試筆記 資料結構 雙向鍊錶

雙向鍊錶是單鏈表的一種改進。單鏈表只能順著指標方向找到結點的後續結點,而無法找到其前驅結點。為此發明了迴圈鍊錶,只要通過迴圈的指標後移,一定可以找到前驅節點。但是迴圈鍊錶操作起來時間複雜度比較高,需要迴圈遍歷整個鍊錶。對於那些需要經常沿兩個方向移動指標的鍊錶來說,雙向鍊錶更合適。與單鏈表不同,雙向鍊...