一。sql語句優化的策略都有哪些:
1.建表的時候。應盡量建立主鍵,根據主鍵查詢資料;
2.大資料表刪除,用truncate table代替delete。
3.合理使用索引,在oltp應用中一張表的索引不要太多。組合索引的列順序盡
量與查詢條件列順序保持一致;對於資料操作頻繁的表,索引需要定期重建,
以減少失效的索引和碎片。
4.查詢盡量用確定的列名,少用*號
5.使用where條件命中索引
6.將能過濾大量資料的where條件放到where條件集合的最前門
7.對於大量的字元匹配,要使用exist,用in拼接的話容易造成sql被無端擷取
二。資料庫表關聯:
分了內連線和外連線。內連線也就是相等連線
外連線分為左外連線和右外連線。
1. left outer join:左外關聯
select e.last_name, e.department_id, d.department_name
from employees e
left outer join departments d
on (e.department_id = d.department_id);
等價於
select e.last_name, e.department_id, d.department_name
from employees e, departments d
where e.department_id=d.department_id(+);
結果為:所有員工及對應部門的記錄,包括沒有對應部門編號department_id的
員工記錄
2. right outer join:右外關聯
select e.last_name, e.department_id, d.department_name
from employees e
right outer join departments d
on (e.department_id = d.department_id);
等價於
select e.last_name, e.department_id, d.department_name
from employees e, departments d
where e.department_id(+)=d.department_id;
結果為:所有員工及對應部門的記錄,包括沒有任何員工的部門記錄。
3. full outer join:全外關聯
select e.last_name, e.department_id, d.department_name
from employees e
full outer join departments d
on (e.department_id = d.department_id);
結果為:所有員工及對應部門的記錄,包括沒有對應部門編號 department_id
的員工記錄和沒有任何員工的部門記錄。
9. 事務:是一系列的資料庫操作,是資料庫應用的基本邏輯單位。事務性質:
原子性。即不可分割性,事務要麼全部被執行,要麼就全部不被執行。
一致性或可串性。事務的執行使得資料庫從一種正確狀態轉換成另一種正確
狀態 隔離性。在事務正確提交之前,不允許把該事務對資料的任何改變提供給任
何其他事務,
永續性。事務正確提交後,其結果將永久儲存在資料庫中,即使在事務提交
後有了其他故障,事務的處理結果也會得到儲存。
儲存過程:儲存過程就是編譯好了的一些sql語句。因為sql語句已經預編繹過
了,因此執行的速度比較快。
grant (select,delete,…) on (物件) to user_name [with grant
option];//授權
revoke (許可權表) on(物件) from user_name [with revoke option] //撤權
create unique index index_name on tablename(col_name);//建索引
insert into tablename values(exp1,exp2,…);//插
入insert into viewname values(exp1,exp2,…);//插入
檢視實際影響表
update tablename set name=』zang 3』,email=『wew』 condition;//更新
資料資料庫索引類似於書的目錄,主要用於提高查詢效率,也就是按條件查詢的時
候,先查詢索引,再通過索引找到相關的資料,索引相當於記錄了對某個關鍵
詞,指定到不同的檔案,或者檔案裡的不同位置,當然索引自身也是通過檔案
來儲存的
加了索引後,也不能保證在每次檢索時都會使用列索引。
如果, sql 檢索語句編寫不當,就無法使用索引。
1、like 運算子,進行模糊檢索時,只能在前方一致的檢索時,才能使用索引
。以下寫法,索引不會被使用。
[sql]
select * from employee where lname_pinyin like '%w%';
select * from employee where lname_pinyin like '%w';
2、使用 is not null 、 <> 的場合,也不會使用索引。如下:
[sql]
select * from employee where lname_pinyin is not null;
select * from employee where lname_pinyin <> 'wang';
3、對列使用了運算或者函式的情況下,不會使用索引,如下:
[sql]
select * from employee where year(birth) = '1980'; -- 不使用索引
select * from employee where birth >= '1980-01-01' and birth <=
'1980-12-31'; --使用了索引
4、復合索引的第一列,沒有包含在 where 條件語句中,如下:
[sql]
create index idx_pinyin on employee(lname_pinyin, fname_pinyin);
select * from employee where lname_pinyin = 'wang' and fname_pinyin =
'xiao'; --用了索引
select * from employee where lname_pinyin = 'wang'; --用了索引
select * from employee where fname_pinyin = 'xiao'; -- 沒有使用索引
select * from employee where lname_pinyin = 'wang' or fname_pinyin =
'xiao'; -- 沒有使用索引
復合索引
[sql]
create index idx_pinyin on employee( lname_pinyin, fname_pinyin);
show index from employee\g
唯一性索引
使用 unique 關鍵字,來建立不可重複的索引,稱為:唯一性索引。
對特定列建立唯一性索引,相當於對該列追加了唯一性制約。
建立唯一性索引的時候,如果物件列中,已經含有重複資料,則:建立失敗,
報錯。建立成功後,如果,插入重複資料,則:插入失敗,報錯。
指定多個列,來建立唯一性索引,只要,這些列的組合資料不重複,就可以創
建成功。
索引,顧名思義,是為了檢索的便捷性。因為索引需要單獨去維護,所以對於
資料庫的刪除,插入,更新操作有影響,批量的操作,速度就會很慢,感覺就
會很明顯。
對於in,rule優化器選擇的內查詢的結果作為驅動表來進行nest loops連線,
所以當內查詢的結果集比較小的時候,這個in的效率還是比較高的。
對於exists,則是利用外查詢表的全表掃瞄結果集過濾內查詢的結果集,當外
查詢的表比較大的時候,相對效率比較低
常見面試資料庫優化
在資料倉儲專案中,由於資料規模龐大,提高資料的查詢效率是永恆的主題,常見的優化手段有 1 硬體優化,提高機器效能,增加硬體等 2 優化查詢語句,將限定性強的where條件放前,用exists代替in操作等 3 優化索引,建立有效的索引並檢查和修復缺少的統計資訊等 4 資料庫系統檔案優化,將資料檔案 ...
資料庫常見面試題
1.事務的四大特性acid 1 原子性 事務包含的操作要麼全部成功,要麼全部回退。2 一致性 事務開始前和開始後,資料庫的完整性沒有被破壞。舉例 轉賬 3 隔離性 對資料庫進行併發操作時,事務不能被其他事務干擾。4 永續性 事務一旦提交,對資料庫的影響是永久的。2.事務的併發 包含3類資料讀和2類資...
資料庫方面常見面試題
1 說出資料連線池的工作機制是什麼 j2ee 伺服器啟動時會建立一定數量的池連線,並一直維持不少於此數目的池連線。客戶端程式需要連線時,池驅動程式會返回乙個未使用的池連線並將其表記為忙。如果當前沒有空閒連線,池驅動程式就新建一定數量的連線,新建連線的數量有配置引數決定。當使用的池連線呼叫完成後,池驅...