程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL數據庫優化(三)

MySQL數據庫優化(三)

編輯:關於MYSQL數據庫

  1. 估算查詢性能

  在大多數情況下,可以通過統計磁盤搜索次數來估算查詢的性能。對小表來說,通常情況下只需要搜索一次磁盤就能找到對應的記錄(因為索引可能已經緩存起來了)。對大表來說,大致可以這麼估算,它使用B樹做索引,想要找到一條記錄大概需要搜索的次數為:log(row_count) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1。

  在MySQL中,一個索引塊通常是1024bytes,數據指針通常是4bytes。對於一個有500,000條記錄、索引長度為3bytes(medium integer)的表來說,根據上面的公式計算得到需要做 log(500,000)/log(1024/3*2/(3+4)) + 1 = 4 次搜索。

  這個表的索引大概需要 500,000 * 7 * 3/2 = 5.2MB的存儲空間(假定典型的索引緩沖區的2/3),因此應該會有更多的索引在內存中,並且可能只需要1到2次調用就能找到對應的記錄。

  對於寫來說,大概需要4次(甚至更多)搜索才能找到新的索引位置,更新記錄時通常需要2次搜索。

  請注意,前面的討論中並沒有提到應用程序的性能會因為log N的值越大而下降。只要所有的東西都能由操作系統或者SQL服務器緩存起來,那麼性能只會因為數據表越大而稍微下降。當數據越來越大之後,就不能全部放到緩存中去了,就會越來越慢了,除非應用程序是被磁盤搜索約束的(它跟隨著的log N值增加而增加)。為了避免這種情況,可以在數據量增大以後也隨著增大索引緩存容量。對 MyISAM 類型表來說,索引緩存容量是由系統變量 key_buffer_size 控制的。

  2. SELECT 查詢的速度

  通常情況下,想要讓一個比較慢的 SELECT ... WHERE 查詢變得更快的第一件事就是,先檢查看看是否可以增加索引。所有對不同表的訪問都通常使用索引。可以使用 EXPLAIN 語句來判斷 SELECT 使用了哪些索引。詳情請看"7.4.5 How MySQL Uses Indexes"和"7.2.1 EXPLAIN Syntax (Get Information About a SELECT)"。

  以下是幾個常用的提高 MyISAM 表查詢速度的忠告:

  想要讓MySQL將查詢優化的速度更快些,可以在數據表已經加載完全部數據後執行行 ANALYZE TABLE 或運行 myisamchk --analyze 命令。它更新了每個索引部分的值,這個值意味著相同記錄的平均值(對於唯一索引來說,這個值則一直都是 1)。MySQL就會在當你使用基於一個非恆量表達式的兩表連接時,根據這個值來決定使用哪個索引。想要查看結果,可以在分析完數據表後運行 SHOW INDEX FROM tbl_name 查看 Cardinality 字段的值。myisamchk --description --verbose 顯示了索引的分布信息。

  想要根據一個索引來排序數據,可以運行 myisamchk --sort-index --sort-records=1 (如果想要在索引 1 上做排序)。這對於有一個唯一索引並且想根據這個索引的順序依次讀取記錄的話來說是一個提高查詢速度的好辦法。不過要注意的是,第一次在一個大表上做排序的話將會耗費很長時間。

  3. MySQL如何優化 WHERE 子句

  這個章節講述了優化程序如何處理 WHERE 子句。例子中使用了 SELECT 語句,但是在 DELETE 和 UPDATE 語句中對 WHERE 子句的優化是一樣的。注意,關於MySQL優化的工作還在繼續,因此本章節還沒結束。MySQL做了很多優化工作,而不僅僅是文檔中提到的這些。

  MySQL的一些優化做法如下:

  去除不必要的括號:

  ((a AND b) AND c OR (((a AND b) AND (c AND d))))

  -> (a AND b AND c) OR (a AND b AND c AND d)

  展開常量:

  (a

  -> b>5 AND b=c AND a=5

  去除常量條件(在展開常量時需要):

  (B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)

  -> B=5 OR B=6

  常量表達示在索引中只計算一次

  • 首頁
  • 上一頁
  • 1
  • 2
  • 3
  • 4
  • 下一頁
  • 尾頁
  • 共4頁
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved