Mysql一些實用的優化實踐

大多數的MySQL服務器都啓動了查詢緩存,但是有些時候,一些特殊的sql語句會阻止MySQL服務器查詢緩存執行任務
使用不固定值來查詢數據

比如使用now()這種不固定的值來查詢數據時,因爲返回的數據都是不確定的,根據時間進行響應獲取的,所以mysql服務器不會去緩存該數據,代碼如下:

SELECT * FROM tableName WHERE ptime LIKE NOW();
獲取唯一行時限制1

有時候我們去數據庫中查詢數據時已經確定了該數據只有一條的時候,可以在後面添加一個限制1的條件,這樣可以讓數據庫引擎在找到1之後就停止記錄,而不會去搜素整個表或者索引

#需求
用戶名和密碼進行登錄
#優化前
SELECT * FROM user WHERE username="chengxi" AND password="chengxi";
#優化後
SELECT * FROM user WHERE username="chengxi" AND password="chengxi" LIMIT 1;
充分利用索引來搜素字段

索引不只是主鍵或者唯一鍵,通常情況下,你可以將你的條件列設置爲索引,當然,有時候還需要去了解那些類型的搜素不能夠使用常規的索引

#優化前
SELECT * FROM tableName WHERE COL="col1";

#優化後
ALTER TABLE tableName ADD INDEX('COL');
SELECT * FROM tableName WHERE COL="col1";
避免select *,最好指定所要查詢的所有列名

有幾種情況:
1.我們只是需要裏面的幾個列值而查詢所有的話就會增加磁盤操作的空間
2.如果我們在後續增加列,那麼就會查詢所有的數據,這樣看起來沒關係,但是如果在我們將返回的數據封裝成一個自定義的entity實體類時就會發生報錯了
所以,總是在執行select查詢時執行需要查詢哪些列是一個好的習慣

最好設置id爲主鍵,即使是在唯一用戶名的用戶表中

即使用戶表中的用戶名字段是唯一的,也最好不要將其設置爲主鍵,因爲varchar作爲主鍵的效率較低

varchar類型的值能用enum最好用enum替換

在mysql中的enum類型的值是非常的緊湊和快速的,他們在內部的存儲類似於TINYINT,但是他們可以包含並顯示字符串值。
如果設置爲varchar的字段的值只有固定幾個值,就將它設置爲enum類型吧

如果可以的話,多用NOT NULL來定義mysql列

在mysql中,NULL列需要額外的空間進行存儲,他們會增加比較語句的複雜性。除非你有一個非常具體的理由來讓該列爲NULL值,否則就加上NOT NULL定義吧

固定長度表(靜態表)的查詢效率會更快

如果表中的每一列都是固定長度的,即不包含varchar/text/blob等可變長度數據類型時,那麼該表就是靜態表,
靜態表可以提高性能,不需要每次查找都查詢主鍵列
靜態表佔用的空間比動態表大,比如varchar(20)與char(20)就是這個原因

參考文獻

20多個MySQL最佳實踐與優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章