您好,登錄后才能下訂單哦!
1、強制使用decimal存儲小數,不使用float、double,防止精度損失,如果存儲的數據范圍超過 decimal 的范圍,建議將數據拆成整數和小數分開存儲。這也是阿里的強制開發規范。
2、高效分頁
limit m,n其實質就是先執行limit m+n,然后從第m行取n行,這樣當limit翻頁越往后翻m越大,性能越低。比如
select * from A limit 100000,10,這種sql語句的性能是很差的,建議改成下面的版本:
selec id,name,age from A where id >=(select id from A limit 100000,1) limit 10
3、InnoDB的行鎖加上死鎖檢測機制會導致數據庫CPU短時間內被占滿,導致整庫幾乎無法響應。
4、對數據分組的總結:
1 分組函數只能出現在選擇列表、having、order by子句中(不能出現在where中) 。
2 如果在select語句中同時包含有where,group by, having, order by 那么它們的順序是where,group by, having, order by 。
3 在選擇列中如果有列、表達式和分組函數,那么這些列和表達式必須有一個出現在group by 子句中,否則就會出錯。
如SELECT deptno, AVG(sal), MAX(sal) FROM emp GROUP by deptno HAVING AVG(sal) < 2000;
這里deptno就一定要出現在group by 中。
5、sql排序默認是升序(從小到大),直接order by,降序是desc。
6、子查詢比關聯查詢效率高。
mysql的innodb的底層存儲模型是B+樹,它使用主鍵作為聚簇索引,使用插入的數據作為葉子節點,通過主鍵可以很快找到葉子節點,從而快速獲取記錄。主鍵最好要自增。因為自增主鍵可以讓插入的數據按主鍵順序插入到底層的B+樹的葉子節點中,由于是按序的,這種插入幾乎不需要去移動已有的其它數據,所以插入效率很高。如果主鍵不是自增的,那么每次主鍵的值近似隨機,這時候就有可能需要移動大量數據來保證B+樹的特性,增加了不必要的開銷。
對于mysql的join,它用的是Nested Loop Join算法,也就是通過前一個表查詢的結果集去后一個表中查詢,比如前一個表的結果集是100條數據,后一個表有10W數據,那么就需要在100*10W的數據集合中去過濾得到最終的結果集。因此,盡量用小結果集的表去和大表做join,同時在join的字段上建立索引,如果建不了索引,就需要設置足夠大的join buffer size
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。