1、首先選擇合適的存儲引擎
如何選擇MyISAM、InnoDB引擎
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) 新浪的新聞id(int), 會使用備份服務器,來存儲之前的數據。
3.3 字符串類型優化
Varchar、char、text
Varchar: 可變類型。 Varchar(20) 存儲:abc 實際佔用長度3字節。
Char: 固定長度。 Char(20) 存儲:abc 實際佔用20字節。
Char的SQL效率更高,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,不參與運算的採用date、datetime等。
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的全文索引
②全文索引目前只支持英文,不支持中文
③分詞技術:將一個搜索關鍵詞拆分爲若干個單詞,並且匹配每個關鍵詞
④主要作用於 varchar,char,text類型字段
⑤MySQL內置的全文檢索有自己的一套分詞算法,其會自動忽略語氣詞,常見詞,出現在50%以上的關鍵詞。
1.10 索引的優勢和劣勢
優勢: 提升SQL的查詢速度,加速表之間的鏈接。
劣勢: 索引會增加磁盤佔用空間,降低增刪改的效率,因爲增刪改時,需要同時維護 MYI 文件。
結論: 合理的建立索引,提升系統效率。 因爲絕大多數系統當中,查詢的操作是遠超於增刪改的操作數量的。但是,不能濫建索引,要分析數據表中哪些字段經常作爲查詢條件,對經常查詢的字段建立索引。
平常寫語句過程中的一些建議:
sql語句優化
1、儘量去掉 in、or
含有in、or、的where子句會使索引失效
like子句儘量前端匹配
因爲like參數使用的非常頻繁,因此如果能夠對like子句使用索引,將很高的提高查詢的效率。
例6:select * from city where name like ‘%S%’
以上查詢的執行計劃用了全表掃描(TABLE ACCESS FULL),如果能夠修改爲:
select * from city where name like ‘S%’