MYSQL
一、引擎
mysql:MySQL是一個關系型數據庫管理系統,其中有兩種引擎最為常見MyISAM和InnoDB

Question
(InnoDB)聚簇結構的特點:
- 根據主鍵查詢條目時,不用回行(數據就在主鍵節點下)
- 如果碰到不規則數據插入時,造成頻繁的頁分裂
為什么會產生頁分裂?
這是因為聚簇索引采用的是平衡二叉樹算法,而且每個節點都保存了該主鍵所對應行的數據,假設插入數據的主鍵是自增長的,那么根據二叉樹算法會很快的把該數據添加到某個節點下,而其他的節點不用動;但是如果插入的是不規則的數據,那么每次插入都會改變二叉樹之前的數據狀態。從而導致了頁分裂。
優化:
聚簇索引的主鍵值,應盡量是連續增長的值,而不是要是隨機值, (不要用隨機字符串或UUID),否則會造成大量的頁分裂與頁移動。在使用InnoDB的時候最好定義成:
id int unsigned primary key auto_increment

索引選擇性與前綴索引
因為索引雖然加快了查詢速度,但索引也是有代價的,另外,MySQL在運行時也要消耗資源維護索引,因此索引並不是越多越好。
一般兩種情況下不建議建索引。
1.表記錄比較少,超過2000條可以酌情考慮索引。
2.索引的選擇性較低。所謂索引的選擇性(Selectivity),是指不重復的索引值(也叫基數,Cardinality)與表記錄數(#T)的比值:
Index Selectivity = Cardinality / #T
顯然選擇性的取值范圍為(0, 1],選擇性越高的索引價值越大,這是由B+Tree的性質決定的。
使用索引掃描來優化排序條件
1.索引的列順序和Order by子句的順序完全一致
2.索引中所有列的方向(升序,降序)和Order by子句完全一致
3.Order by中的字段全部在關聯表中的第一張表中
1、查版本號
無論做什么都要確認版本號,不同的版本號下會有各種差異。
>Select version();

2、執行狀態分析
顯示哪些線程正在運行
>show processlist; (端口號給我馬賽克了,見諒見諒,安全起見)

3、Show profile
精確兩位數,小數點。
show profile默認的是關閉的,但是會話級別可以開啟這個功能,開啟它可以讓MySQL收集在執行語句的時候所使用的資源。
分析SQL執行帶來的開銷是優化SQL的常用手段,在MySQL數據庫中,可以通過配置profiling參數來啟用SQL剖析。
它只能在session級別來設置,設置后影響當前session;當它開啟后,后續執行的SQL語句都將記錄其資源開銷,諸如IO,上下文,CPU,MEMORY等。
開啟profiling,有個警告,這個參數在以后會被刪除,用information_scheam.PROFILING替代。
(設置profiling=1,開啟profile)
(使用命令:show profile 觀看執行時間,15行受影響)
根據query id查看某個查詢得詳細時間耗時。
Explain的列分析
如查詢語句:
查詢語句是explain select * from goods order by goods_id asc \G