在資料庫程式的開發中,效能是最讓人關心和擔心的問題之一,而影響到其效能的乙個關鍵因素就是查詢效率,
往往查詢效率的瓶頸都集中在大量耗時的sql語句上。
以下就將列舉一些mysql中行之有效的查詢優化手法和準則:
1.只要能滿足你的需求,應盡可能使用更小的資料型別:例如使用mediumint代替int。
2.盡量把所有的列設定為not null,如果你要儲存null,手動去設定它,而不是把它設為預設值。
3.盡量少用varchar、text、blob型別。
4.如果你的資料只有你所知的少量的幾個,最好使用enum型別。
5.任何對列的操作都將導致表掃瞄,它包括資料庫函式、計算表示式等等,查詢時要盡可能將操作移至等號右邊。
6.使用索引來更快地遍歷表。
預設情況下建立的索引是非群集索引,但有時它並不是最佳的。在非群集索引下,資料在物理上隨機存放在資料頁上。合理的索引設計要建立在對各種查詢的分析和**上。一般來說:
a.有大量重複值、且經常有範圍查詢( > ,< ,> =,< =)和order by、group by發生的列,可考慮建立群集索引;
b.經常同時訪問多列,且每列都含有重複值可考慮建立組合索引;
c.組合索引要盡量使關鍵查詢形成索引覆蓋,其前導列一定是使用最頻繁的列。索引雖有助於提高效能但不是索引越多越好,恰好相反過多的索引會導致系統低效。使用者在表中每加進乙個索引,維護索引集合就要做相應的更新工作。
注意:1)in、or子句常會使用工作表,使索引失效。如果不產生大量重複值,可以考慮把子句拆開。拆開的子句中應該包含索引。
這句話怎麼理解決,例子如下:
如果在fields1和fields2上同時建立了索引,fields1為主索引
以下sql會用到索引
select * from tablename1 where fields1='value1' and fields2='value2'
以下sql不會用到索引
select * from tablename1 where fields1='value1' or fields2='value2'
2)索引帶來查詢上的速度的大大提公升,但索引也占用了額外的硬碟空間(當然現在一般硬碟空間不成問題),而且往表中插入新記錄時索引也要隨著更新這也需要一定時間.有些表如果經常insert,而較少select,就不用加索引了.不然每次寫入資料都要重新改寫索引,花費時間,這個視實際情況而定,通常情況下索引是必需的。
對於多表查詢的優化原則是:
盡量將索引建立在:left join on/right join on ... +條件,的條件語句中所涉及的字段上,這樣多表查詢比單錶查詢更能體現索引的優勢。
7.在海量查詢時盡量少用格式轉換。
在對查詢效率有懷疑的時候,一般是直接用mysql的explain來跟蹤查詢情況.如果用mysql-front是通過時長來比較,但是從查詢時掃瞄欄位的次數來比較更精確一些.
MySQL資料庫優化技巧
在5.5之後預設的儲存引擎是innodb 可以單獨進行修改也可以在建立表時修改 alter table tab name engine innodb 十六 小心永久鏈結 永久鏈結 的目的是用來減少重新建立mysql鏈結的次數。當乙個鏈結被建立了,它會永遠處在連線的狀態,就算是資料庫操作已經結束了。而...
SQL Server資料庫查詢優化技巧
文中,abigale代表查詢字串,ada代表資料表名,alice代表欄位名。技巧一 問題型別 access資料庫欄位中含有日文片假名或其它不明字元時查詢會提示記憶體溢位。解決方法 修改查詢語句 sql select from ada where alice like abigale 改為sql se...
mysql 資料庫查詢優化
合理選擇表字段型別型別 int型別優先於varchar型別 優先於text型別 varchar 變長字串 型別優先於char 不可變長 型別 表分割 對於頻繁使用的且資料量增長很快的表進行表的分割 水平分割 當一張表資料量非常大影響效率時,可將表中的資料按一定的演算法將其進行水平方向 行 的分割,如...