關於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: