mysql優化

1、首先選擇合適的存儲引擎

 如何選擇MyISAMInnoDB引擎

1) 如果項目對數據的完整性要求不高,偏重SQL的執行效率就選擇MyISAM。例如:CMS(內容管理系統), 論壇, 微博,  qq空間。

2) 項目對數據的完整性要求非常高,必須使用InnoDB。例如:銀行系統,財務系統,ERP(企業資源計劃),OA, 網上商城。


2、選擇合適的字段類型

   1) 人的年齡(unsigned tiny int)、狗的年齡(tinyint)、烏龜的年齡(unsigned smallint)

   2) 京東商城的商品類別id(unsigned smallint)

   3) 華爲erp系統的用戶id(mediumint)

   4) 優酷會員id(unsigned int)

   5) 新浪的新聞idint), 會使用備份服務器,來存儲之前的數據。

 3.3 字符串類型優化

Varcharchartext

Varchar: 可變類型。 Varchar(20)  存儲:abc   實際佔用長度3字節。

Char: 固定長度。 Char(20)    存儲:abc     實際佔用20字節。

 

CharSQL效率更高,varchar效率低,佔用空間小

 

手機號: char(11)

座機號: 3位區號-8位號碼    4位區號-8位號碼    4位區號-7位號碼  char(12)

用戶密碼: MD5  char(32)。  

用戶名: varchar(30)

文章標題: varchar(30)

文章摘要: varchar(255)

 3.5 枚舉類型與集合類型(複合類型的數據)

Enum(枚舉): 單選。

Set(集合):  多選。

能夠使用枚舉或者集合,一定不要使用字符串。

Sex: 使用枚舉。

Hobby: 使用集合。

在底層,枚舉和集合是整型保存。

 3.7儘量使用 not null

除非你有一個非常特殊的需求,否則一定要加 not null屬性。 允許空比非空佔用的空間更大,允許空字段在執行sql時,會執行更復雜的運算。

最好再加上  default

 3.8 字段類型使用總結

1) 整型: 在滿足需求的情況下,儘量選擇小類型。

2) 能用整型就不用字符串: 枚舉、集合來代替字符串,保存ip地址時將字符串轉爲整型

3) 在使用字符串時,固定長度一定選擇char;可變長度,儘量減小長度。

4) 時間類型,參與運算比較多的採用int,不參與運算的採用datedatetime等。

Unix_timestamp() 將字符串時間轉爲時間戳

From_unixtime() 將時間戳轉爲字符串時間

5) 儘量使用 not null

3、三範式原則

第一範式(確保每列保持原子性)

第二範式(確保表中的每列都和主鍵相關)

第三範式(確保每列都和主鍵列直接相關,而不是間接相關)

4、索引

1.1 什麼是索引

索引是把字段A的內容儲存在一個獨立區間S裏,裏面只有這個字段的內容和其對應的物理地址。在找查與這個字段A相關的內容時會直接從這個獨立區間裏查找,而不是去到數據表裏查找。該查找速度非常快,因爲索引內部有排序算法。


 1.3 索引類型

主鍵索引,唯一索引,普通索引,全文索引。

1.4 主鍵索引

創建表時設置主鍵索引:

create table user1(

  Uid int auto_increment,

  Uname varchar(20) not null,

  Primary key (uid)

);

 

主鍵索引的特點: 整型 auot_increment

 

在已經存在表的情況下,增加主鍵索引:

Alter  table  表名  add  primary  key(字段名)

Alter  table  user1  add  primary  key(uid);

 

刪除主鍵索引:

Alter  table  表名  drop primary  key;

Alter  table  user1  drop primary  key;

 1.5 唯一索引

unique: 給不會重複的字段增加, 用戶名。

創建表時增加唯一索引:

刪除唯一索引:

Alter  table  表名  drop  index  索引名稱

Alter  table  user2  drop  index  uni_name;

1.6 普通索引

普通索引: 用戶名, 商品類別等。

 關鍵詞: index  /  key

刪除普通索引:

Alter  table  表名  drop  index  索引名稱;

Alter  table  user3  drop  index  index_name;

 

增加普通索引:

Alter  table  表名 add  index/key  [索引名稱](字段名)

Alter  table  user3  add  key (uanme);

 1.7 全文索引

 ①MyISAM支持,MySQL5.6以上版本支持InnoDB的全文索引

 ②全文索引目前只支持英文,不支持中文

 ③分詞技術:將一個搜索關鍵詞拆分爲若干個單詞,並且匹配每個關鍵詞

 ④主要作用於 varcharchartext類型字段

 ⑤MySQL內置的全文檢索有自己的一套分詞算法,其會自動忽略語氣詞,常見詞,出現在50%以上的關鍵詞

1.10 索引的優勢和劣勢

優勢: 提升SQL的查詢速度,加速表之間的鏈接。

劣勢: 索引會增加磁盤佔用空間,降低增刪改的效率,因爲增刪改時,需要同時維護 MYI 文件。

結論: 合理的建立索引,提升系統效率。 因爲絕大多數系統當中,查詢的操作是遠超於增刪改的操作數量的。但是,不能濫建索引,要分析數據表中哪些字段經常作爲查詢條件,對經常查詢的字段建立索引。

平常寫語句過程中的一些建議:

sql語句優化

1、儘量去掉 inor

含有inor、的where子句會使索引失效

like子句儘量前端匹配

因爲like參數使用的非常頻繁,因此如果能夠對like子句使用索引,將很高的提高查詢的效率。

6select * from city where name like ‘%S%’

以上查詢的執行計劃用了全表掃描(TABLE ACCESS FULL),如果能夠修改爲:

select * from city where name like ‘S%’


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