1、數據庫中的字段類型不要使用long型,否則會造成查詢緩慢,可以選擇BigInt類型來代替。
2、避免select *。
3、如果表結構中字段定義的類型與應用傳入的類型不一致,這時候可能會發生隱式轉換;兩個表join的時候,如果字符集定義不一致,也會導致隱式轉換,MySQL中定義的隱式轉換規則如下所示:
a、兩個參數至少有一個是NULL時,比較的結果也是NULL,例外是使用<=>對兩個NULL做比較時會返回1,這兩種情況都不需要做類型轉換;
b、兩個參數都是字符串,會按照字符串來比較,不做類型轉換;
c、兩個參數都是整數,按照整數來比較,不做類型轉換;
d、十六進制的值和非數字做比較死活,會被當作二進制串;
e、有一個參數是TIMESTAMP或DATETIME,并且另外一個參數是常量,常量會被轉換為timestamp;
f、有一個參數是decimal類型,如果另外一個參數是decimal或者整數,會將整數轉換為decimal后進行比較,如果另外一個參數是浮點數,則會把decimal轉換為浮點數進行比較;
g、所有其它情況下,兩個參數都會被轉換為浮點數再進行比較;
隱式轉換會使索引失效,導致查詢無法命中索引。
4、limit m,n
mysql翻頁查詢使用下面的語法:select * from table limit m,n;
其中m是指記錄開始的index,數據庫中的第一條記錄標記為0,n是指從第m+1條記錄開始,取n條數據。
比如select * from table limit 2,4,該語句取出第3條至第6條數據,共4條記錄。
需要注意的是普通的limit M,N的翻頁寫法,在越往后翻頁的過程中速度越慢,原因是由于mysql會讀取表中的前M+N條數據,M越大,則性能越差??梢赃x擇的優化方式是使用關聯子查詢進行優化,如下面的實驗,我們先后用上下兩條語句查詢數據庫的100條數據:
優化前:select * from table limit 10000,100;優化后:select * from hregiondb a,(select id from hregiondb limit 10000,100) b where a.id=b.id兩條查詢語句的耗時如下圖,可見優化后查詢的速度快了不少。
5、刪除表中數據
如果要清空表中的所有記錄,可以使用如下兩種方式:
方式一:delete from table方式二:truncate table其中delete的方式可以返回被刪除的記錄數,但執行速度不快,相反,truncate不能返回被刪除的記錄條數,但是執行速度快。推薦使用truncate方式,這是因為binlog有個row格式,delete時會把所有被操作數據的整行都記錄在binlog里,如果表中數據量很大,會造成binlog的急劇膨脹。
此外采用先truncate后drop的方式也可以減少系統表被鎖定的時間。
7、索引要仔細設計,保證索引有很好的過濾性,這是因為索引本身也占消耗。什么叫過濾性好的索引,舉個例子,比如一張職工表,那么性別字段就無需建立索引。
8、optimize table
mysql中刪除了數據時,被刪除數據占用的磁盤空間并沒有馬上被釋放,而是被寫入了一個標記為,只有執行了optimize之后,這部分空間包括索引位才會被釋放出來。
9、可以使用explain命令查看sql語句的執行計劃
我們使用上面那條語句來看看explain命令的結果。
explain select * from hregiondb a,(select id from hregiondb limit 10000,100) b where a.id=b.id結果截圖如下:
各個列的解釋簡列如下:
1、select_type,select類型,simple表示最簡單的select,PRimary出現在有子查詢的語句中,最外面的select查詢就是primary;
2、table,顯示這一行的數據是關于哪張表的;
3、type,顯示連接使用了何種類型,從最好到最差的連接類型為const、eq_reg、ref、range、indexhe和ALL;
4、possible_keys,顯示可能應用在該表中的索引;
5、key,實際使用的索引;
6、key_len,使用的索引的長度,該值越小越好;
7、ref,顯示索引的哪一列被使用了;
8、rows,mysql認為必須檢查的用來返回請求數據的行數;
9、Extra,額外信息,如果是Using temporary或者Using filesort,意味著mysql不會使用索引,這樣的檢索會很慢;
新聞熱點
疑難解答