-
估計查詢性能
在大多數(shù)情況下刷晋,可以通過計算磁盤搜索來估計性能生均。對小的表,通常能在1次磁盤搜索中找到行(因為索引可能被緩存)邦马。對更大的表贱鼻,可以使用B-樹索引進行估計,將需要log(row_count)/log(index_block_length/3 * 2/(index_length + data_pointer_length))+1次搜索才能找到行滋将。
在MySQL中忱嘹,索引塊通常是1024個字節(jié),數(shù)據(jù)指針通常是4個字節(jié)耕渴,這對于有一個長度為3(中等整數(shù))的索引的500,000行的表,通過公式可以計算出log(500,000)/log(1024/3*2/(3+4))+1= 4次搜索齿兔。
上面的索引需要大約500,000 * 7 * 3/2 = 5.2MB橱脸,(假設(shè)典型情況下索引緩存區(qū)填充率為2/3),可以將大部分索引保存在內(nèi)存中分苇,僅需要1-2調(diào)用從OS讀數(shù)據(jù)來找出行添诉。
然而對于寫,將需要4次搜索請求(如上)來找到在哪兒存放新索引医寿,并且通常需要2次搜索來更新這個索引并且寫入行栏赴。
注意,上述討論并不意味著應用程序的性能將緩慢地以logN 退化靖秩!當表格變得更大時须眷,所有內(nèi)容緩存到OS或SQL服務器后,將僅僅或多或少地更慢沟突。在數(shù)據(jù)變得太大不能緩存后花颗,將逐漸變得更慢,直到應用程序只能進行磁盤搜索(以logN增加)惠拭。為了避免這個問題扩劝,隨數(shù)據(jù)增加而增加 鍵高速緩沖區(qū)大小。對于MyISAM表, 由key_buffer_size系統(tǒng)變量控制 鍵高速緩沖區(qū)大小职辅。
-
SELECT查詢的速度
總的來說棒呛,要想使一個較慢速SELECT ... WHERE更快,應首先檢查是否能增加一個索引域携。不同表之間的引用通常通過索引來完成簇秒。你可以使用EXPLAIN語句來確定SELECT語句使用哪些索引。
下面是一些加速對MyISAM表的查詢的一般建議:
為了幫助MySQL更好地優(yōu)化查詢涵亏,在一個裝載數(shù)據(jù)后的表上運行ANALYZE TABLE或myisamchk --analyze宰睡。這樣為每一個索引更新指出有相同值的行的平均行數(shù)的值(當然蒲凶,如果只有一個索引,這總是1拆内。)MySQL使用該方法來決定當你聯(lián)接兩個基于非常量表達式的表時選擇哪個索引旋圆。你可以使用SHOW INDEX FROM tbl_name并檢查Cardinality值來檢查表分析結(jié)果。myisamchk --description --verbose可以顯示索引分布信息麸恍。
要想根據(jù)一個索引排序一個索引和數(shù)據(jù)灵巧,使用myisamchk --sort-index --sort-records=1(如果你想要在索引1上排序)。如果只有一個索引抹沪,想要根據(jù)該索引的次序讀取所有的記錄刻肄,這是使查詢更快的一個好方法。但是請注意融欧,第一次對一個大表按照這種方法排序時將花很長時間敏弃!