深入浅出Mysql(一)
1、慢查詢基礎:優化數據訪問 
 對于低效率查詢,我們可以通過以下兩個步驟來分析總是有效的: 
 1、確認應用程序是否在檢索大量超過需要的數據。這通常意味著訪問了太多的行,當時有時候也可能訪問了太多的列 
 2、確認Mysql服務器層是否在分析大量超過需要的數據行 
 1.1 是否向數據庫請求了不需要的數據 
 典型案例 
 查詢不需要的記錄 
 在查詢時,Mysql會先返回全部結果集再進行計算,客戶端應用程序會接收全部的結果集數據,然后拋棄其中大部分數據。最簡單有效的解決辦法在查詢后面加上limit 
 多表關聯返回所有列 
 總是取出全部列 
 重復查詢相同數據 
 比較好的解決辦法是將這個數據緩存起來,需要的時候從緩存中取 
 1.2 Mysql是否在掃描額外的記錄 
 對于Mysql,最簡單衡量查詢開銷的三個指標是: 
 響應時間 
 掃描的行數 
 返回的行數 
 一般Mysql能夠使用如下三種方式應用where條件,從好到壞一次為: 
 1、在索引中使用where條件來過濾不匹配記錄。這是在存儲引擎層完成。 
 2、使用索引覆蓋掃描(在Extra列中出現Using index)來返回記錄,直接從索引中過濾不需要的記錄并返回命中的結果。這是在Mysql服務器層完成的,但無需再過濾表的查詢記錄 
 3、從數據表中返回數據,然后過濾不滿足條件的記錄(在Extra列出現Using where)。這在Mysql服務器層完成,Mysql需要先從數據表中讀出記錄然后過濾 
 2、重構查詢的方式 
 如果有機會盡量分解關聯查詢,這樣做的好處: 
 1、讓緩存效率更高 
 2、執行單個查詢時減少了鎖的競爭 
 3、在應用層做關聯,可以容易對數據庫進行拆分,更容易做到高性能擴展 
 4、減少冗余記錄查詢 
 Mysql的存儲引擎包括:Myisam、InnoDB、BDB、Memory、Merge、Example、NDB Cluster、CSV等,其中InnoDB和BDB提供事務安全表,其他存儲引擎都是非事務安全表。 
 下面介紹幾種常用的存儲引擎: 
 1、Myisam:默認的Mysql插件式存儲引擎,他是在Web、數據倉儲和其他應用環境下最常使用的存儲引擎之一 
 2、InnoDB:用于事務處理應用程序,具有眾多特性,包括ACID特性。 
 3、Memory:將所有的數據保存在RAM中,在需要快速查找引用和其他類似數據的環境下,可以提供極快的訪問 
 4、Merge:允許Mysql DBA或開發人員將一系列等同的Myisam表以邏輯方式組合在一起,并作為1個對象引用他們。對于數據倉儲等環境十分適合 
 選擇合適的數據類型 
 1、固定長度數據列char和可變長度數據列varchar 
 對于InnoDB存儲引擎,內部的行存儲格式沒有區分固定長度和可變長度列(所有的數據行都使用指向數據列值的頭指針),因此在本質上,使用固定長度不一定比可變長度簡單,建議使用varchar。他們的存儲差別如下: 
  
 如果Mysql運行在嚴格模式,超過列的長度值不保存,并且會出現錯誤。 
 2、text和blob 
 blob和text值在執行了大量的刪除或更新操作的時候,刪除這種值會在數據表中留下很大的空洞,為了提高性能,建議定期使用optimize table功能對這類表進行碎片整理。 
 合成的散列索引對于那些blob或text數據列特別有用。用散列標識符值查找的速度比搜索blob列本身的速度快很多。 
 在不必要的時候避免檢索大型的blob或text值 
 把blob或text列分離到單獨的表中 
 索引的設計和使用 
 設計索引的原則 
 1、搜索的索引列不一定是索要選擇的列。也就是說,最適合索引的列是出現在where字句中的列,或連接字句中指定的列,而不是select關鍵字后的選擇列表中的列 
 2、使用唯一索引。 
 3、使用短索引。如果對串列進行索引,應該指定一個前綴長度,例如:如果一個char(200)的列,如果在前10個或20個字符內,多數值是唯一的,那么就不要對整個列進行索引,這樣可以節省內存。 
 4、利用最左前綴。 
 5、不要過度索引 
 6、考慮在列上進行比較類型。索引可用于<,<=,=,>=,>,between
總結
以上是生活随笔為你收集整理的深入浅出Mysql(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 写出漂亮的代码
 - 下一篇: 军训分批(codevs 2751)