MySQL優化的一點記錄。


關於mysql調優的一點記錄


對於數據庫的性能瓶頸,影響第一位的是sql語句。所有對於sql的優化是數據庫性能的基本處理,也是代價最小的。

其他的影響因素依次包括(IO性能、CPU處理能力、服務器內存DRAM、網絡速度IOPS、磁盤大小)。


Mysql優化的分類

a:sql語句的使用

b:表的合理化設計

c:添加索引

d:Mysql配置的優化

e:分表的設計

f:讀寫分離

g:存儲過程:將經常使用的sql進行存儲過程,比如分頁;

h:服務器的硬件升級

I:定時清除不需要的數據,定時進行碎片整理。


1.將經常要用到的字段(比如經常要用這些字段來排序,或者用來做搜索),則最好將這些字段設爲索引。


2.字段的種類儘可能用int 或者tinyint類型。另外字段儘可能用NOT NULL。


3.當然無可避免某些字段會用到text ,varchar等字符類型,最好將text字段的單獨出另外一個表出來(用主鍵關聯好)


4.字段的類型,以及長度,是一個很考究開發者優化功力的一個方面。如果表數據有一定的量了,不妨用PROCEDURE ANALYSE()

命令來取得字段的優化建議!(在phpmyadmin裏可以在查看錶時,點擊 “Propose table structure” 來查看這些建議) 如此

可以讓你的表字段結構 趨向完善。


5.select * 儘量少用,你想要什麼字段 就select 什麼字段出來 不要老是用* 號!同理,只要一行數據時儘量使用 LIMIT 1


6.絕對不要輕易用order by rand() ,很可能會導致mysql的災難!!


7.每個表都應該設置一個ID主鍵,最好的是一個INT型,並且設置上自動增加的AUTO_INCREMENT標誌,這點其實應該

作爲設計表結構的第一件必然要做的事!!


8.拆分大的 DELETE 或 INSERT 語句。因爲這兩個操作是會鎖表的,表一鎖住了,別的操作都進不來了,就我來說 有時候

我寧願用for循環來一個個執行這些操作。


9.不要用永久鏈接 mysql_pconnect();除非你真的非常肯定你的程序不會發生意外,不然很可能也會導致

mysql死掉。


10.永遠別要用複雜的mysql語句來顯示你的聰明。就我來說,看到一次關聯了三,四個表的語句,只會讓人覺得很不靠譜。

11.開啓緩存查詢。

12.使用EXPLAIN 對複雜的SELECT 查詢 ,進行比較調優。

13.對於會使用LIKE%%查詢的字段建立索引。

14.使用 ENUM 而不是 VARCHAR 。對於選項型數據,使用枚舉存儲。例如國家,民族,省份等等。

15.無緩存查詢,mysql_unbuffered_query() 較 mysql_query() 節約內存,不會去查找緩存中的記錄。

16.固定長度的表會更快,

如果表中的所有字段都是“固定長度”的,整個表會被認爲是 “static” 或 “fixed-length”。 例如,

表中沒有如下類型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一個這些字段,那麼這個表

就不是“固定長度靜態表”了,這樣,MySQL 引擎會用另一種方法來處理。 固定長度的表會提高性能,

因爲MySQL搜尋得會更快一些,因爲這些固定的長度是很容易計算下一個數據的偏移量的,所以讀取的

自然也會很快。而如果字段不是定長的,那麼,每一次要找下一條的話,需要程序找到主鍵。 並且,固定

長度的表也更容易被緩存和重建。不過,唯一的副作用是,固定長度的字段會浪費一些空間,因爲定長的

字段無論你用不用,他都是要分配那麼多的空間。 

17.選擇正確的存儲引擎 
在 MySQL 中有兩個存儲引擎 MyISAM 和 InnoDB,每個引擎都有利有弊。有文章《MySQL: InnoDB 

還是 MyISAM?》討論和這個事情。 MyISAM 適合於一些需要大量查詢的應用,但其對於有大量寫操作

並不是很好。甚至你只是需要update一個字段,整個表都會被鎖起來,而別的進程,就算是讀進程都無

法操作直到讀操作完成。另外,MyISAM 對於 SELECT COUNT(*) 這類的計算是超快無比的。 InnoDB 

的趨勢會是一個非常複雜的存儲引擎,對於一些小的應用,它會比 MyISAM 還慢。他是它支持“行鎖” 

,於是在寫操作比較多的時候,會更優秀。並且,他還支持更多的高級應用,比如:事務。 


-----


1: with rollup 不能和order by 同時使用。


2:關於count(*)的優化:

在使用count() 通過where查詢統計個數時,數據比較大的情況下,使用count((distinct 字段) where 

字段 ** 且 該字段要建立索引。

如 $mysqli->query("select count(distinct id) as cc from article where year(createtime)='2015'"); 

統計創建時間是2015年的文章的總數,使用主鍵id,也可以使用其他有索引的字段。

3:




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