收集实用的MySQL使用技巧
? ? ? ? ?
01. 索引對數(shù)據(jù)庫性能如此重要,如何使用它?
為數(shù)據(jù)庫選擇正確的索引是一項復雜的任務。如果索引列較少,則需要的磁盤空間和維護開銷 都較少。如果在一個大表上創(chuàng)建了多種組合索引,索引文件也會膨脹很快。
而另一方面,索引較多,可覆蓋更多的查詢。可能需要試驗若干不同的設計,才能找到最有效的索引。可以添加、修改和刪 除索引而不影響數(shù)據(jù)庫架構或應用程序設計。因此,應嘗試多個不同的索引從而建立最優(yōu)的索引。
02. 盡量使用短索引
對字符串類型的字段進行索引,如果可能應該指定一個前綴長度。例如,如果有一個 CHAR(255)的列,如果在前10個或30個字符內(nèi),多數(shù)值是惟一的,則不需要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節(jié)省磁盤空間、減少I/O操作。
03. MySQL存儲過程和函數(shù)有什么區(qū)別?
在本質上它們都是存儲程序。函數(shù)只能通過return語句返回單個值或者表對象;而存儲過程 不允許執(zhí)行return,但是可以通過out參數(shù)返回多個值。函數(shù)限制比較多,不能用臨時表,只能用表變量,還有一些函數(shù)都不可用等等;而存儲過程的限制相對就比較少。函數(shù)可以嵌入在SQL 語句中使用,可以在SELECT語句中作為查詢語句的一個部分調用;而存儲過程一般是作為一個獨立的部分來執(zhí)行.
04. 存儲過程中的代碼可以改變嗎?
目前,MySQL還不提供對已存在的存儲過程代碼的修改,如果必須要修改存儲過程,必須使用DROP語句刪除之后,再重新編寫代碼,或者創(chuàng)建一個新的存儲過程。
05. 存儲過程中可以調用其他存儲過程嗎?
存儲過程包含用戶定義的SQL語句集合,可以使用CALL語句調用存儲過程,當然在存儲 過程中也可以使用CALL語句調用其他存儲過程,但是不能使用DROP語句刪除其他存儲過程。
06. 存儲參數(shù)不要與數(shù)據(jù)表中的字段名相同
在定義存儲過程參數(shù)列表時,應注意把參數(shù)名與數(shù)據(jù)庫表中的字段名區(qū)別開來,否則將出 現(xiàn)無法預期的結果。
07. 存儲過程的參數(shù)可以使用中文嗎?
一般情況下,可能會出現(xiàn)存儲過程中傳入中文參數(shù)的情況,例如某個存儲過程根據(jù)用戶的 名字查找該用戶的信息,傳入的參數(shù)值可能是中文。這時需要在定義存儲過程的時候,在后面加上character set gbk,不然調用存儲過程使用中文參數(shù)會出錯,比如定義userInfo存儲過程,代碼 如下:
CREATE?PROCEDURE?useInfo(IN?u_name?VARCHAR(50)?character?set?gbk,?OUT?u_age?INT)08. MySQL中視圖和表的區(qū)別以及聯(lián)系?
兩者的區(qū)別:
視圖是已經(jīng)編譯好的SQL語句,是基于SQL語句的結果集的可視化的表,而表不是。
視圖沒有實際的物理記錄,而基本表有。
表是內(nèi)容,視圖是窗口。
表占用物理空間而視圖不占用物理空間,視圖只是邏輯概念的存在,表可以及時對它 進行修改,但視圖只能用創(chuàng)建的語句來修改。
視圖是查看數(shù)據(jù)表的一種方法,可以查詢數(shù)據(jù)表中某些字段構成的數(shù)據(jù),只是一些SQL 語句的集合。從安全的角度來說,視圖可以防止用戶接觸數(shù)據(jù)表,因而用戶不知道表結構。
表屬于全局模式中的表,是實表;視圖屬于局部模式的表,是虛表。
視圖的建立和刪除只影響視圖本身,不影響對應的基本表。
兩者的聯(lián)系:
視圖(view)是在基本表之上建立的表,它的結構(即所定義的列)和內(nèi)容(即所有記錄) 都來自基本表,它依據(jù)基本表存在而存在。一個視圖可以對應一個基本表,也
可以對應多個基本 表。視圖是基本表的抽象和在邏輯意義上建立的新關系。
09. 使用觸發(fā)器時須特別注意
在使用觸發(fā)器的時候需要注意,對于相同的表,相同的事件只能創(chuàng)建一個觸發(fā)器,比如對 表account創(chuàng)建了一個BEFORE INSERT觸發(fā)器,那么如果對表account再次創(chuàng)建一個BEFORE INSERT觸發(fā)器,MySQL將會報錯,此時,只可以在表account上創(chuàng)建AFTER INSERT或者 BEFORE UPDATE類型的觸發(fā)器。靈活的運用觸發(fā)器將為操作省去很多麻煩。
10. 及時刪除不再需要的觸發(fā)器
觸發(fā)器定義之后,每次執(zhí)行觸發(fā)事件,都會激活觸發(fā)器并執(zhí)行觸發(fā)器中的語句。如果需求 發(fā)生變化,而觸發(fā)器沒有進行相應的改變或者刪除,則觸發(fā)器仍然會執(zhí)行舊的語句,從而會影響 新的數(shù)據(jù)的完整性。因此,要將不再使用的觸發(fā)器及時刪除。
11. 提高sql查詢效率的30個查詢語句優(yōu)化方法
01
對查詢進行優(yōu)化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。
02
應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。
03
應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null可以在num上設置默認值0,確保表中num列沒有null值,然后這樣查詢:
select id from t where num=004
應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num=10 or num=20可以這樣查詢:
select id from t where num=10union allselect id from t where num=2005
下面的查詢也將導致全表掃描:
select id from t where name like '%abc%'若要提高效率,可以考慮全文檢索。
06
in 和 not in 也要慎用,否則會導致全表掃描,如:
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對于連續(xù)的數(shù)值,能用 between 就不要用 in 了:
select id from t where name like 'abc%'select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'07
如果在 where 子句中使用參數(shù),也會導致全表掃描。因為SQL只有在運行時才會解析局部變量,但優(yōu)化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變量的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:
select id from t where num=@num可以改為強制查詢使用索引:
select id from t with(index(索引名)) where num=@num08
應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select col1,col2 into #t from t where 1=0應改為:
create table #t(...)09
應盡量避免在where子句中對字段進行函數(shù)操作,這將導致引擎放棄使用索引而進行全表掃描。如:
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'10
不要在?where 子句中的“=”左邊進行函數(shù)、算術運算或其他表達式運算,否則系統(tǒng)將不能正確使用索引。
11
在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統(tǒng)使用該索引,否則該索引將不會被使用,并且應盡可能的讓字段順序與索引順序相一致。
12
不要寫一些沒有意義的查詢,如需要生成一個空表結構:
select col1,col2 into #t from t where 1=0這類代碼不會返回任何結果集,但是會消耗系統(tǒng)資源的,應改成這樣:
create table #t(...)13
很多時候用 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)14
并不是所有索引對查詢都有效,SQL是根據(jù)表中數(shù)據(jù)來進行查詢優(yōu)化的,當索引列有大量數(shù)據(jù)重復時,SQL查詢可能不會去利用索引,如一表中有字段sex,male、female幾乎各一半,那么即使在sex上建了索引也對查詢效率起不了作用。
15
索引并不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數(shù)最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。
16
應盡可能的避免更新 clustered 索引數(shù)據(jù)列,因為 clustered 索引數(shù)據(jù)列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統(tǒng)需要頻繁更新 clustered 索引數(shù)據(jù)列,那么需要考慮是否應將該索引建為 clustered 索引。
17
盡量使用數(shù)字型字段,若只含數(shù)值信息的字段盡量不要設計為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字符串中每一個字符,而對于數(shù)字型而言只需要比較一次就夠了。
18
盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長字段存儲空間小,可以節(jié)省存儲空間,其次對于查詢來說,在一個相對較小的字段內(nèi)搜索效率顯然要高些。
19
任何地方都不要使用 select * from t ,用具體的字段列表代替“*”,不要返回用不到的任何字段。
20
盡量使用表變量來代替臨時表。如果表變量包含大量數(shù)據(jù),請注意索引非常有限(只有主鍵索引)。
21
避免頻繁創(chuàng)建和刪除臨時表,以減少系統(tǒng)表資源的消耗。
22
臨時表并不是不可使用,適當?shù)厥褂盟鼈兛梢允鼓承├谈行?#xff0c;例如,當需要重復引用大型表或常用表中的某個數(shù)據(jù)集時。但是,對于一次性事件,最好使用導出表。
23
在新建臨時表時,如果一次性插入數(shù)據(jù)量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數(shù)據(jù)量不大,為了緩和系統(tǒng)表的資源,應先create table,然后insert。
24
如果使用到了臨時表,在存儲過程的最后務必將所有的臨時表顯式刪除,先 truncate table ,然后 drop table ,這樣可以避免系統(tǒng)表的較長時間鎖定。
25
盡量避免使用游標,因為游標的效率較差,如果游標操作的數(shù)據(jù)超過1萬行,那么就應該考慮改寫。
26
使用基于游標的方法或臨時表方法之前,應先尋找基于集的解決方案來解決問題,基于集的方法通常更有效。
27
與臨時表一樣,游標并不是不可使用。對小型數(shù)據(jù)集使用 FAST_FORWARD 游標通常要優(yōu)于其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的數(shù)據(jù)時。在結果集中包括“合計”的例程通常要比使用游標執(zhí)行的速度快。如果開發(fā)時間允許,基于游標的方法和基于集的方法都可以嘗試一下,看哪一種方法的效果更好。
28
在所有的存儲過程和觸發(fā)器的開始處設置 SET NOCOUNT ON ,在結束時設置 SET NOCOUNT OFF 。無需在執(zhí)行存儲過程和觸發(fā)器的每個語句后向客戶端發(fā)送 DONE_IN_PROC 消息。
29
盡量避免向客戶端返回大數(shù)據(jù)量,若數(shù)據(jù)量過大,應該考慮相應需求是否合理。
30
盡量避免大事務操作,提高系統(tǒng)并發(fā)能力。
文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協(xié)助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識
總結
以上是生活随笔為你收集整理的收集实用的MySQL使用技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么把照片做成计算机主题,windows
- 下一篇: 后来的我们王俊凯王源机器人_王俊凯杨紫到