Posts Tagged ‘效能’

提升效能 : 資料對齊

二月 3rd, 2009

程式通常都被要求要先把事情做對,再來要求效能,很多人常把事情倒過來做,我以前也喜歡這樣做,為什麼? 因為想要提升效能需要很多瑣碎的知識,當你知道一樣新的想法可以讓程式更快,就會想迫不急待的把它加到你的程式裡,但是程式執行結果都未必正確的情況下,這樣做只會增加程式的複雜度,結果都不正確了,跑再快又有什麼用? 但是到了真正到了把事情做對之後,就是到了開始恨自己瞭解的東西太少,我開始回想以前那些零碎的知識片段,看見我的程式存取記憶體,還有指標,讓我想起了一個重要的概念,資料對齊,這是一個很重要的概念,當資料的位址或長度不是CPU善長處理的數值時,CPU就需要花更多時間去處理,這也就是為什麼資料需要對齊的原因,會發現這個概念是因為我以前在寫struct寫入檔案時一直遇到一個莫明奇妙的bug,我發現struct的大小比我預料的大,後來才知道是資料對齊,編譯器自動將它填到對齊好的大小,現在我回想起來,找了一下,找到了一篇很不錯的文章,圖文並茂地說明了資料對齊的概念

Data alignment: Straighten up and fly right

當瞭解資料對齊的概念之後,就會明白為什麼buffer的長度常常會取256, 512, 1024等等數字

為什麼MySQL的InnoDB Select Count(*)這麼慢

一月 31st, 2009

在美國租的主機不停的在抓資料,現在已經到了3百萬筆了,對於要知道筆數,最直觀的方式就是使用

Select Count(*) From xxx

但是我發現這樣極奇的慢,我們可能覺得很奇怪,以設計上來看,通常應該都要有個欄位是用來記錄這個資料表有多少筆資料,何以可以慢到這種地步,在上網找一堆資料,終於發現了原因,原來因為InnoDB可能有不通的交易同時發生,每筆交易中,可能會有刪除、新增等等事件發生,所以可以說每筆交易裡看到的筆數都是不一樣的,因此每次select count(*)都要做整張表的掃描,到了百萬的數量級,會這麼慢是理所當然的,替代的做法,可以使用

Show Table Status Like ‘xxx’

裡面有個欄位是行數,不過那個數字會和真的數字有差別,欄位裡的數字比較』髒』,但是以大部份的用途,像我們會用到Select Count(*)通常是想知道裡面有幾筆資料,不是很要緊的數字的話,其實差一些也不會怎樣,最經典的應用通常是』我們的網站有xxx個會員』,根本沒人會在意那個數字差了一點

這問題的答案我是在這篇文章裡找到的

COUNT(*) for Innodb Tables

我發現那真的是一個很棒的部落格

MySQL Performance Blog

如同上面所寫的

Everything about MySQL Performance

裡面只談MySQL的效能問題,如何提升的做法,作者群似乎是來自一家專門幫忙提升MySQL資料庫效能的公司,遇到MySQL效能的問題這個部落格應該可以找到很好的答案,除此之外他們也有出一本High Performance MySQL, Second Edition的書