1. 程式人生 > >數據庫相關內容

數據庫相關內容

沒有 有一個 reat 很大的 lsp 描述 替代 面試總結 掃描

1***

1.Mysql表的快速復制

create table new_table select * from old_tablecreate table new_table like old_table insert new_table select * from old_table

  • 1

這兩種方法的特點:第一種方法需要手動添加主鍵、索引等。第二種方法是完全復制,推薦這種方法

此外,如果想從另外表導入數據:

Insert into table1(col1,col2,…) Select col1, col2,… from table2

  • 1
  • 1

2.分頁優化

分頁在實際的項目中應用的十分廣泛,

但是當數據量大時, 其效率問題令人擔憂。先看下我們通常采用的分頁語句:

Select * from table where …. Order by X limit start, sizeSelect * from table where …. Order by X limit 10000, 10

  • 1
  • 2
  • 1
  • 2

隨著start的增大,查詢的效率越差, 需要進一步優化。

優化的方式主要有兩種方式 1:子查詢 2:連接查詢

Select * from (Select * from table where id>(select id from table order by id desc limit 10000, 1) limit 10) order by id desc

SELECT * FROM table INNER JOIN ( SELECT id FROM table ORDER BY id DESC LIMIT 10000,10) t2 USING (id)

1.SQL語句優化

1.對查詢進行優化,要盡量避免全表掃描,首先應考慮在 where order by 涉及的列上建立索引。

2.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num is null

最好不要給數據庫留NULL,盡可能的使用 NOT NULL填充數據庫.

備註、描述、評論之類的可以設置為

NULL,其他的,最好不要使用NULL

不要以為 NULL 不需要空間,比如:char(100) 型,在字段建立時,空間就固定了, 不管是否插入值(NULL也包含在內),都是占用 100個字符的空間的,如果是varchar這樣的變長字段, null 不占用空間。

可以在num上設置默認值0,確保表中num列沒有null值,然後這樣查詢:

select id from t where num = 0

3.應盡量避免在 where 子句中使用 != <> 操作符,否則將引擎放棄使用索引而進行全表掃描。

4.應盡量避免在 where 子句中使用 or 來連接條件,如果一個字段有索引,一個字段沒有索引,將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num=10 or Name = ‘admin‘

可以這樣查詢:

select id from t where num = 10union allselect id from t where Name = ‘admin‘

5.in not in 也要慎用,否則會導致全表掃描,如:

select id from t where num in(1,2,3)

對於連續的數值,能用 between 就不要用 in

select id from t where num between 1 and 3

很多時候用 exists 代替 in 是一個好的選擇:

select num from a where num in(select num from b)

用下面的語句替換:

select num from a where exists(select 1 from b where num=a.num)

6.下面的查詢也將導致全表掃描:

select id from t where name like ‘%abc%’

若要提高效率,可以考慮全文檢索。

9.應盡量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:

select id from t where substring(name,1,3) = ’abc’ -–name以abc開頭的idselect id from t where datediff(day,createdate,’2005-11-30′) = 0 -–‘2005-11-30’ --生成的id

應改為:

select id from t where name like ‘abc%‘select id from t where createdate >= ‘2005-11-30‘ and createdate < ‘2005-12-1‘。

11.在使用索引字段作為條件時,如果該索引是復合索引,那麽必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓字段順序與索引順序相一致。

12.不要寫一些沒有意義的查詢,如需要生成一個空表結構:

select col1,col2 into #t from t where 1=0

這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:

create table #t(…)

13.Update 語句,如果只更改12個字段,不要Update全部字段,否則頻繁調用會引起明顯的性能消耗,同時帶來大量日誌。

14.對於多張大數據量(這裏幾百條就算大了)的表JOIN,要先分頁再JOIN,否則邏輯讀會很高,性能很差。

15.select count(*) from table;這樣不帶任何條件的count會引起全表掃描,並且沒有任何業務意義,是一定要杜絕的。

16.索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert update 的效率,因為 insert update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。

3.數據庫結構優化

優化

優化:適當的冗余,增加計算列

  數據庫設計的實用原則是:在數據冗余和處理速度之間找到合適的平衡點

滿足範式的表一定是規範化的表,但不一定是最佳的設計。很多情況下會為了提高數據庫的運行效率,常常需要降低範式標準:適當增加冗余,達到以空間換時間的目的。比如我們有一個表,產品名稱,單價,庫存量,總價值。這個表是不滿足第三範式的,因為總價值”可以由“單價”乘以“數量”得到,說明“金額”是冗余字段。但是,增加“總價值”這個冗余字段,可以提高查詢統計的速度,這就是以空間換時間的作法。合理的冗余可以分散數據量大的表的並發壓力,也可以加快特殊查詢的速度,冗余字段可以有效減少數據庫表的連接,提高效率。

其中"總價值"就是一個計算列,在數據庫中有兩種類型:數據列和計算列,數據列就是需要我們手動或者程序給予賦值的列,計算列是源於表中其他的數據計算得來,比如這裏的"總價值"

SQL中創建計算列:

create table table1
(
number decimal(18,4),
price money,
Amount as number*price --這裏就是計算列
)

也可以再表設計中,直接手動添加或修改列屬性即可:如下圖

是否持久性,我們也需要註意:

如果是,說明這列是虛擬列,每次查詢的時候計算一次,而且那麽它是不可以用來做check,foreign key或not null約束

如果是‘,就是真實的列,不需要每次都計算,可以再此列上創建索引等等。

優化:索引

索引是一個表優化的重要指標,在表優化中占有極其重要的成分,所以將單獨寫一章”SQL索引一步到位“去告訴大家如何建立和優化索引

優化:主鍵和外鍵的必要性

主鍵與外鍵的設計,在全局數據庫的設計中,占有重要地位。 因為:主鍵是實體的抽象,主鍵與外鍵的配對,表示實體之間的連接。

主鍵:根據第二範式,需要有一個字段去標識這條記錄,主鍵無疑是最好的標識,但是很多表也不一定需要主鍵,但是對於數據量大,查詢頻繁的數據庫表,一定要有主鍵,主鍵可以增加效率、防止重復等優點。

外鍵:外鍵作為數據庫對象,實際上,外鍵在大部分情況下是很有用的,理由是:外鍵是最高效的一致性維護方法

優化:存儲過程、視圖、函數的適當使用

很多人習慣將復雜操作都放在應用程序層,但如果你要優化數據訪問性能,將SQL代碼移植到數據庫上(使用存儲過程,視圖,函數和觸發器)也是一個很大的改進原因如下:

1. 存儲過程減少了網絡傳輸、處理及存儲的工作量,且經過編譯和優化,執行速度快,易於維護,且表的結構改變時,不影響客戶端的應用程序

2、使用存儲過程,視圖,函數有助於減少應用程序中SQL復制的弊端,因為現在只在一個地方集中處理SQL

3、使用數據庫對象實現所有的TSQL有助於分析TSQL的性能問題,同時有助於你集中管理TSQL代碼,更好的重構TSQL代碼

優化:傳說中的三少原則

:數據庫的表越少越好

:表的字段越少越好

:字段中的組合主鍵、組合索引越少越好

當然這裏的少是相對的,是減少數據冗余的重要設計理念。

優化:分割你的表,減小表尺寸

如果你發現某個表的記錄太多,例如超過一千萬條,則要對該表進行水平分割。水平分割的做法是,以該表主鍵的某個值為界線,將該表的記錄水平分割為兩個表。

如果你若發現某個表的字段太多,例如超過八十個,則垂直分割該表,將原來的一個表分解為兩個表

優化:字段設計原則

字段是數據庫最基本的單位,其設計對性能的影響是很大的。需要註意如下:

A、數據類型盡量用數字型,數字型的比較比字符型的快很多。

B 數據類型盡量小,這裏的盡量小是指在滿足可以預見的未來需求的前提下的。

C 盡量不要允許NULL,除非必要,可以用NOT NULL+DEFAULT代替。

D、少用TEXT和IMAGE,二進制字段的讀寫是比較慢的,而且,讀取的方法也不多,大部分情況下最好不用。

E 自增字段要慎用,不利於數據遷移

9.存儲過程與觸發器的區別

觸發器與存儲過程非常相似,觸發器也是SQL語句集,兩者唯一的區別是觸發器不能用EXECUTE語句調用,而是在用戶執行Transact-SQL語句時自動觸發(激活)執行。觸發器是在一個修改了指定表中的數據時執行的存儲過程。常通過創建觸發器來強制實現不同表中的邏輯相關數據的引用完整性和一致性。由於用戶不能繞過觸發器,所以可以用它來強制實施復雜的業務規則,以確保數據的完整性。觸發器不同於存儲過程,觸發器主要是通過事件執行觸發而被執行的,而存儲過程可以通過存儲過程名稱名字而直接調用。當對某一表進行諸如UPDATEINSERTDELETE這些操作時,SQLSERVER就會自動執行觸發器所定義的SQL語句,從而確保對數據的處理必須符合這些SQL語句所定義的規則

bullets

mysql數據庫面試總結

索引優化

一、 創建索引,以下情況不適合建立索引

l 表記錄太少

l 經常插入、刪除、修改的表

l 數據重復且分布平均的表字段

二、 復合索引

如果一個表中的數據在查詢時有多個字段總是同時出現則這些字段就可以作為復合索引

索引

索引是對數據庫表中一列或多列的值進行排序的一種結構。

優點:

l 大大加快數據的檢索速度

l 創建唯一性索引,保證數據庫表中每一行數據的唯一性

l 可以加速表和表之間的連接

缺點:

l 索引需要占物理空間。

l 當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,

索引分類:

l 普通索引

create index zjj_temp_index_1 on zjj_temp_1(first_name);

drop index zjj_temp_index_1;

l 唯一索引,索引列的值必須唯一,但允許有空值

create unique index zjj_temp_1 on zjj_temp_1(id);

l 主鍵索引,它是一種特殊的唯一索引,不允許有空值。

l 組合索引

2*******

4. Oracle的導入導出有幾種方式,有何區別?
1). 使用oracle工具 exp/imp
2). 使用plsql相關工具
方法1. 導入/導出的是二進制的數據, 2.plsql導入/導出的是sql語句的文本文件
5. Oracle中有哪幾種文件?
數據文件(一般後綴為.dbf或者.ora),日誌文件(後綴名.log),控制文件(後綴名為.ctl

6. 怎樣優化Oracle數據庫,有幾種方式?
個人理解,數據庫性能最關鍵的因素在於IO,因為操作內存是快速的,但是讀寫磁盤是速度很慢的,優化數據庫最關鍵的問題在於減少磁盤的IO,就個人理解應該分為物理的和邏輯的優化, 物理的是指oracle產品本身的一些優化,邏輯優化是指應用程序級別的優化
物理優化的一些原則:
1). Oracle的運行環境(網絡,硬件等)
2). 使用合適的優化器
3). 合理配置oracle實例參數
4). 建立合適的索引(減少IO
5). 將索引數據和表數據分開在不同的表空間上(降低IO沖突)
6). 建立表分區,將數據分別存儲在不同的分區上(以空間換取時間,減少IO
邏輯上優化:
1). 可以對表進行邏輯分割,如中國移動用戶表,可以根據手機尾數分成10個表,這樣對性能會有一定的作用
2). Sql語句使用占位符語句,並且開發時候必須按照規定編寫sql語句(如全部大寫,全部小寫等)oracle解析語句後會放置到共享池中
如: select * from Emp where name=? 這個語句只會在共享池中有一條,而如果是字符串的話,那就根據不同名字存在不同的語句,所以占位符效率較好
3). 數據庫不僅僅是一個存儲數據的地方,同樣是一個編程的地方,一些耗時的操作,可以通過存儲過程等在用戶較少的情況下執行,從而錯開系統使用的高峰時間,提高數據庫性能
4). 盡量不使用*號,如select * from Emp,因為要轉化為具體的列名是要查數據字典,比較耗時
5). 選擇有效的表名
對於多表連接查詢,可能oracle的優化器並不會優化到這個程度, oracle 中多表查詢是根據FROM字句從右到左的數據進行的,那麽最好右邊的表(也就是基礎表)選擇數據較少的表,這樣排序更快速,如果有link表(多對多中間表),那麽將link表放最右邊作為基礎表,在默認情況下oracle會自動優化,但是如果配置了優化器的情況下,可能不會自動優化,所以平時最好能按照這個方式編寫sql
6). Where字句 規則
Oracle Where字句時從右往左處理的,表之間的連接寫在其他條件之前,能過濾掉非常多的數據的條件,放在where的末尾, 另外!=符號比較的列將不使用索引,列經過了計算(如變大寫等)不會使用索引(需要建立起函數), is nullis not null等優化器不會使用索引
7). 使用Exits Not Exits 替代 In Not in
8). 合理使用事務,合理設置事務隔離性
數據庫的數據操作比較消耗數據庫資源的,盡量使用批量處理,以降低事務操作次數

9. Oracle是怎樣分頁的?
Oracle中使用rownum來進行分頁, 這個是效率最好的分頁方法,hibernate也是使用rownum來進行oralce分頁的
select * from
( select rownum r,a from tabName where rownum <= 20 )
where r > 10

21. 怎樣創建一個一個索引,索引使用的原則,有什麽優點和缺點

索引的優缺點:
有點:
1. 創建唯一性索引,保證數據庫表中每一行數據的唯一性
2. 大大加快數據的檢索速度,這也是創建索引的最主要的原因
3. 加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
4. 在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
缺點:
1. 索引創建在表上,不能創建在視圖上
2. 創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加
3. 索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那麽需要的空間就會更大
4. 當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度

22. 怎樣創建一個視圖,視圖的好處, 視圖可以控制權限嗎?
create view 視圖名 as select 列名 [別名] … from 表 [unio [all] select … ] ]
好處:
1. 可以簡單的將視圖理解為sql查詢語句,視圖最大的好處是不占系統空間
2. 一些安全性很高的系統,不會公布系統的表結構,可能會使用視圖將一些敏感信息過慮或者重命名後公布結構
3. 簡化查詢
可以控制權限的,在使用的時候需要將視圖的使用權限grant給用戶
23. 怎樣創建一個觸發器, 觸發器的定義, 觸發器的遊標怎樣定義
CREATE [OR REPLACE] TIGGER觸發器名 觸發時間 觸發事件
 ON表名
 [FOR EACH ROW]
 BEGIN
  pl/sql語句
CURSOR 遊標名 is SELECT * FROM 表名 (定義遊標)
  END
 其中:
 觸發器名:觸發器對象的名稱。
 由於觸發器是數據庫自動執行的,因此該名稱只是一個名稱,沒有實質的用途。
觸發時間:指明觸發器何時執行,該值可取:
before---表示在數據庫動作之前觸發器執行;
after---表示在數據庫動作之後出發器執行。
觸發事件:指明哪些數據庫動作會觸發此觸發器:
   insert:數據庫插入會觸發此觸發器;

24. oracle創建表的幾種方式;應該註意些什麽
不知道這個題目是不是記錯了,感覺很怪
1. 使用圖形工具創建表
2. 使用數據ddl語句創建表
3. 可以在plsql代碼中動態創建表
應該註意: 是否有創建表的權限, 使用什麽表空間等
25. 怎樣將一個舊數據庫數據移到一個新的數據庫
1. Imp/exp將數據庫中的數據導入到新的庫中
2. 如果是存儲遷移直接將存儲設備掛到新機器上
26. 主鍵有幾種;
字符型,整數型、復合型
27. oracle的鎖又幾種,定義分別是什麽;

12、如何實現數據庫的優化?
A、調整數據結構的設計。這一部分在開發信息系統之前完成,程序員需要考慮是否使用ORACLE數據庫的分區功能,對於經常訪問的數據庫表是否需要建立索引等。

B、調整應用程序結構設計。這一部分也是在開發信息系統之前完成,程序員在這一步需要考慮應用程序使用什麽樣的體系結構,是使用傳統的Client/Server兩層體系結構,還是使用Browser/Web/Database的三層體系結構。不同的應用程序體系結構要求的數據庫資源是不同的。

C、調整數據庫SQL語句。應用程序的執行最終將歸結為數據庫中的SQL語句執行,因此SQL語句的執行效率最終決定了ORACLE數據庫的性能。ORACLE公司推薦使用ORACLE語句優化器(Oracle Optimizer)和行鎖管理器(row-level manager)來調整優化SQL語句。

D、調整服務器內存分配。內存分配是在信息系統運行過程中優化配置的,數據庫管理員可以根據數據庫運行狀況調整數據庫系統全局區(SGA區)的數據緩沖區、日誌緩沖區和共享池的大小;還可以調整程序全局區(PGA區)的大小。需要註意的是,SGA區不是越大越好,SGA區過大會占用操作系統使用的內存而引起虛擬內存的頁面交換,這樣反而會降低系統。

E、調整硬盤I/O,這一步是在信息系統開發之前完成的。數據庫管理員可以將組成同一個表空間的數據文件放在不同的硬盤上,做到硬盤之間I/O負載均衡。

F、調整操作系統參數,例如:運行在UNIX操作系統上的ORACLE數據庫,可以調整UNIX數據緩沖池的大小,每個進程所能使用的內存大小等參數。

16.oracle事務處理

什麽是事務

事務用於保證數據的一致性,它由一組相關的dml語句組成,該組的dml(數據操作語言,增刪改,沒有查詢)語句要麽全部成功,要麽全部失敗

如:網上轉賬就是典型的要用事務來處理,用於保證數據的一致性。

dml 數據操作語言 銀行轉賬、QQ申請、車票購買

事務和鎖

當執行事務操作時(dml語句),oracle會在被作用的表上加鎖,防止其它用戶修改表的結構。這裏對我們的用戶來來講是非常重要的。

.....其它進程排序,知道1號進程完成,鎖打開,2號進程進入。依次進行,如果有進程級別較高的,可以插隊。

提交事務

當執行用commit語句可以提交事務。當執行了commit語句之後,會確認事務的變化、結束事務。刪除保存點、釋放鎖,當使用commit語句結束事務之後,其它會話將可以查看到事務變化後的新數據

保存點就是為回退做的。保存點的個數沒有限制

回退事務

在介紹回退事務前,我們先介紹一下保存點(savepoint)的概念和作用。保存點是事務中的一點。用於取消部分事務,當結束事務時,會自動的刪除該事務所定義的所有保存點。當執行rollback時,通過指定保存點可以回退到指定的點,這裏我們作圖說明。

現象:

控制臺1在操作數據庫時,若沒提交(commit)動作時,則我們控制臺2看到的信息就會在控制臺1中結果不一樣。

即:

數據庫把一系列的對數據庫的操作看做一個整體,要麽全部成功,要麽全部失敗,這樣的現象稱為事物現象,事務具有原子性

18.oracle 序列(sequence)

需求:在某張表中,存在一個id(整數),我們希望添加記錄的時候,該列從1開始,自動的增長

解決方式:oracle是利用(sequence)來完成的

序列特點:由用戶創建數據庫對象可由多個用戶共享(system可以使用scott創建的序列),一般用於主鍵或唯一列,可為表中的列自動產生值。

問題:若system使用scott的序列,從什麽開始增長? 答案:接著增長

insert into test1values(scott.myseq.nextval,‘kkk‘);

數據庫相關內容