在美國租的主機不停的在抓資料,現在已經到了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的書