SQL優化的思路:
1.優化更需要優化的sql;
2.定位優化對象的性能瓶頸:優化前需了解查詢的瓶頸是IO還是CPU,可通過PROFILING很容易定位查詢的瓶頸。
3.明確優化目標;
4.從Explain入手;
5.多使用profile;
SQL優化的基本原則:
1.永遠用小結果集驅動大結果集;
From子句中sql解析順序為從右向左,執行時會以最左邊的表為基礎表循環與右邊表數據做笛卡爾積,所以以小結果集驅動能減少循環次數,從而減少對被驅動結果集的訪問,從而減少被驅動表的鎖定。
2.盡可能在索引中完成排序;
排序算法有兩種:a.查出排序字段和行指針,排序,再通過行指針獲得行數據所需列,返回結果集;b.取出所有排序列數據,在排序緩沖區中排完序直接返回結果集。
索引排序是利用索引的有序性對數據排序的。
3.只取出子集需要的colums
4.僅僅使用最有效的過濾條件;
5.盡可能避免復雜的Join和子查詢;
索引的好處:
(1).提高數據檢索效率,降低數據庫的IO成本。
(2).降低數據排序成本:要求排序字段和索引鍵字段一致。
(3).降低數據分組成本:因為分組之前會先排序,同意如果分組字段與索引字段一致,會降低分組消耗的成本。
索引的弊端:
(1).索引是獨立於基礎數據的數據庫對象,因此它會占用存儲空間。
(2).數據新增、更新會導致索引的同步更新,所以會增加數據新增、更新所消耗的成本。
判斷是否需要創建索引:
(1).較為頻繁的作為查詢條件的字段需要創建索引;
(2). 唯一性太差的字段不適合單獨創建索引,即使頻繁作為查詢條件;
(3).更新非常頻繁的字段不適合創建索引;
(4).不會出現在where子句中的字段不要創建索引;
索引語法:
(1).唯一索引
ALTER TABLE tableName ADD UNIQUE indexName (column);
CREATE UNIQUE INDEX indexName ON tableName (column);
(2).普通索引
ALTER TABLE tableName ADD INDEX indexName(column);
CREATE INDEX indexName ON tableName(column);
(3).主鍵索引
ALTER TABLE tableName ADD PRIMARY KEY (column);
(4).全文索引
ALTER TABLE tableName ADD FULLTEXT (column);
(5).組合索引
ALTER TABLE tableName ADD INDEX indexName(col1,col2,...);