mysql優化面試總結

總結

 

1.數據庫的設計
儘量把數據庫設計的更小的佔磁盤空間.
1).儘可能使用更小的整數類型.(mediumint就比int更合適).
2).儘可能的定義字段爲not null且設定默認值,除非這個字段需要null.
3).只創建確實需要的索引。索引有利於檢索記錄,但是不利於快速保存記錄。如果總是要在表的組合字段上做搜索,那麼就在這些字段上創建索引。索引的第一部分必須是最常使用的字段.如果總是需要用到很多字段,首先就應該多複製這些字段,使索引更好的壓縮。
4).數據庫三大範式。
5).在某些情況下,把一個頻繁掃描的表分成兩個速度會快好多。在對動態格式表掃描以取得相關記錄時,它可能使用更小的靜態格式表的情況下更是如此。 
6)儘可能的使用 varchar 代替 char ,因爲首先變長字段存儲空間小,可以節省存儲空間,    
其次對於查詢來說,在一個相對較小的字段內搜索效率顯然要高些
2.系統的用途
1).儘量使用長連接.
2).explain 複雜的SQL語句,查看SQL執行計劃。
3).如果兩個關聯表要做連接話,連接的字段必須類型和長度都一致.
4).LIMIT語句儘量要跟order by或者 distinct.這樣可以避免做一次full table scan.
5).如果想要清空表的所有紀錄,建議用truncate table tablename而不是delete from tablename.
6).能使用STORE PROCEDURE 或者 USER FUNCTION的時候.
7).在一條insert語句中採用多重紀錄插入格式.而且使用load data infile來導入大量數據,這比單純的indert快好多.
8).經常OPTIMIZE TABLE 來整理碎片.
9).還有就是date 類型的數據如果頻繁要做比較的話儘量保存在unsigned int 類型比較快。
)SQL語句中IN包含的值不應過多,對於連續的值,例如in(1,2,3..),可使用between 代替in
)select 後接具體的列名,別使用*。
)當只需要一條數據的時候,使用limit 1。(這是爲了使EXPLAIN中type列達到const類型)
)如果排序字段沒有用到索引,就儘量少排序
)儘量使用union all 或者 union代替or使用
)like ‘%*%’查詢,會導致索引失效,可使用全文索引替代
例如:
ALTER TABLE `table_name` ADD FULLTEXT INDEX `idx_user_name` (`user_name`);
使用全文索引的sql語句是:

select id,fnum,fdst from table_name 
    
where match(user_name) against('zhangsan' in boolean mode);

強烈注意:MySql自帶的全文索引只能用於數據庫引擎爲MYISAM的數據表(innodb5.6.4以後也行),如果是其他數據引擎,則全文索引不會生效。此外,MySql自帶的全文索引只能對英文進行全文檢索,目前無法對中文進行全文檢索。如果需要對包含中文在內的文本數據進行全文檢索,我們需要採用Sphinx(斯芬克斯)/Coreseek技術來處理中文。

 

注:目前,使用MySql自帶的全文索引時,如果查詢字符串的長度過短將無法得到期望的搜索結果。MySql全文索引所能找到的詞默認最小長度爲4個字符。另外,如果查詢的字符串包含停止詞,那麼該停止詞將會被忽略。

 

注:如果可能,請儘量先創建表並插入所有數據後再創建全文索引,而不要在創建表時就直接創建全文索引,因爲前者比後者的全文索引效率要高。

3.系統的瓶頸
1).磁盤搜索.
並行搜索,把數據分開存放到多個磁盤中,這樣能加快搜索時間.
2).磁盤讀寫(IO)
可以從多個媒介中並行的讀取數據。
3).CPU週期
數據存放在主內存中.這樣就得增加CPU的個數來處理這些數據。
4).內存帶寬
當CPU要將更多的數據存放到CPU的緩存中來的話,內存的帶寬就成了瓶頸.

對一些特定的數據,可使用redis做緩存,例如session、緩存、隊列數據、臨時中轉數據、等等,先從redis提取數據,如果沒有再訪問mysql提取。

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