一、獨立的索引列。索引不能是表達式的一部分,也就是說索引列不能參與任何計算和函數方法(衝當參數)等。mysql
二、不要肆意使用索引。並非說爲where條件以後的全部查詢列都加上索引就必定會提高查詢性能。sql
三、當where後面出現兩個以上索引列時,應該考慮使用多列索引。數據庫
四、注意索引列的順序(針對多列索引)。將選擇性最高的放在前面,好比有兩個索引,一個是專業一個班級,那顯然篩選專業比篩選班級更快,由於專業數據比班級要少不少。緩存
未完待續……網絡
一、避免查詢大量的數據,大量的數據很是消耗內存,而且避免使用*,若是列不少,會增長mysql服務層的負擔。
函數
二、對索引字段的數據篩選是在數據庫引擎層進行,很是高效,對非索引的篩選是在數據庫服務層先篩選再去引擎獲取數據,因此where條件儘可能使用索引並且避免一些複雜的條件,好比函數。
性能
三、切分查詢,好比要查詢全部的學生,可使用limit分次查詢,從而避免單次查詢阻塞網絡和磁盤io等,同理也是用其餘語句。
優化
四、分解關聯查詢,將聯表、子查詢分解成獨立的單表查詢不只能夠提升緩存命中率,還能夠改善查詢性能,減小鎖競爭,在應用層對數據進行關聯性能比在數據庫進行關聯效率要高不少。
spa
五、排序是一個成本很高的操做,應該儘可能是排序的字段是索引字段
排序
六、mysql對子查詢支持並非很好,在mysql中應該儘可能使用子查詢。當無可奈何的時候,好比where id in ( select * from table limit 1)的時候,能夠改寫成這樣where id exists( select * from table limit 1),由於mysql對exists作了改進
七、當進行關聯的時候確保on左右兩邊的列都有索引。
八、查詢時可使用視圖,增刪改時使用原表,有些版本也支持直接對視圖進行增刪改,這樣作能夠將表和應用解耦,也更加靈活。
未完待續……