mysql數據庫優化須要遵照的准繩。本站提示廣大學習愛好者:(mysql數據庫優化須要遵照的准繩)文章只能為提供參考,不一定能成為您想要的結果。以下是mysql數據庫優化須要遵照的准繩正文
這是我在網上看到的一篇不錯的mysql數據庫優化文章,內容說的很全!
1、應用索引來更快地遍歷表
缺省情形下樹立的索引長短群集索引,但有時它其實不是最好的。在非群集索引下,數據在物理上隨機寄存在數據頁上。公道的索引設計要樹立在對各類查詢的剖析和猜測上。普通來講:
a.有年夜量反復值、且常常有規模查詢( > ,< ,> =,< =)和order by、group by產生的列,可斟酌樹立群集索引;
b.常常同時存取多列,且每列都含有反復值可斟酌樹立組合索引;
c.組合索引要盡可能使症結查詢構成索引籠罩,其前導列必定是應用最頻仍的列。索引雖有助於進步機能但不是索引越多越好,正好相反過量的索引會招致體系低效。用戶在表中每加進一個索引,保護索引聚集就要做響應的更新任務。
2、在海量查詢時盡可能罕用格局轉換
3、ORDER BY和GROPU BY:應用ORDER BY和GROUP BY短語,任何一種索引都有助於SELECT的機能進步。
4、任何對列的操作都將招致表掃描,它包含數據庫函數、盤算表達式等等,查詢時要盡量將操作移至等號左邊。
5、IN、OR子句常會應用任務表,使索引掉效。假如不發生年夜量反復值,可以斟酌把子句拆開。拆開的子句中應當包括索引。
6、只需能知足你的需求,應盡量應用更小的數據類型:例如應用MEDIUMINT取代INT
7、盡可能把一切的列設置為NOT NULL,假如你要保留NULL,手動去設置它,而不是把它設為默許值。
8、盡可能罕用VARCHAR、TEXT、BLOB類型
9、假如你的數據只要你所知的大批的幾個。最好應用ENUM類型
10、正如graymice所講的那樣,樹立索引。
以下是我做的一個試驗,可以發明索引能極年夜地進步查詢的效力:
我有一個會員信息表users,裡邊有37365條用戶記載:
在不加索引的時刻停止查詢:
sql語句A:
代碼:
select * from users where username like '%許%';
在Mysql-Front中的8次查詢時長為:1.40,0.54,0.54,0.54,0.53,0.55,0.54 共找到960筆記錄
sql語句B:
代碼:
select * from users where username like '許%';
在Mysql-Front中的8次查詢時長為:0.53,0.53,0.53,0.54,0.53,0.53,0.54,0.54 共找到836筆記錄
sql語句C:
代碼:
select * from users where username like '%許';
在Mysql-Front中的8次查詢時長為:0.51,0.51,0.52,0.52,0.51,0.51,0.52,0.51 共找到7筆記錄
為username列添加索引:
代碼:
create index usernameindex on users(username(6));
再次查詢:
sql語句A:
代碼:
select * from users where username like '%許%';
在Mysql-Front中的8次查詢時長為:0.35,0.34,0.34,0.35,0.34,0.34,0.35,0.34 共找到960筆記錄
sql語句B:
代碼:
select * from users where username like '許%';
在Mysql-Front中的8次查詢時長為:0.06,0.07,0.07,0.07,0.07,0.07,0.06,0.06 共找到836筆記錄
sql語句C:
代碼:
select * from users where username like '%許';
在Mysql-Front中的8次查詢時長為:0.32,0.31,0.31,0.32,0.31,0.32,0.31,0.31 共找到7筆記錄
在試驗進程中,我沒有另開任何法式,以上的數聽說明在單表查詢中,樹立索引的可以極年夜地進步查詢速度。
別的要說的是假如樹立了索引,關於like '許%'類型的查詢,速度晉升是最顯著的。是以,我們在寫sql語句的時刻也盡可能采取這類方法查詢。
關於多表查詢我們的優化准繩是:
盡可能將索引樹立在:left join on/right join on ... +前提,的前提語句中所觸及的字段上。
多表查詢比單表查詢更能表現索引的優勢。
11、索引的樹立准繩:
假如一列的中數據的前綴反復值很少,我們最好就只索引這個前綴。Mysql支撐這類索引。我在下面用到的索引辦法就是對username最右邊的6個字符停止索引。索引越短,占用的 磁盤空間越少,在檢索進程中花的時光也越少。這辦法可以對最多左255個字符停止索引。
在許多場所,我們可以給樹立多列數據樹立索引。
索引應當樹立在查詢前提中停止比擬的字段上,而不是樹立在我們要找出來而且顯示的字段上
12、一往情深問到的成績: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'
[/code]
13.索引帶來查詢上的速度的年夜年夜晉升,但索引也占用了額定的硬盤空間(固然如今普通硬盤空間不成成績),並且往表中拔出新記載時索引也要跟著更新這也須要必定時光。
有些表假如常常insert,而較少select,就不消加索引了.否則每次寫入數據都要從新改寫索引,消費時光; 這個視現實情形而定,平日情形下索引是必須的。
14.我在對查詢效力有疑惑的時刻,普通是直接用Mysql的Explain來跟蹤查詢情形。
你用Mysql-Front是經由過程時長來比擬,我認為假如從查詢時掃描字段的次數來比擬更准確一些。