没有where的count()使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count()时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count()时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count()的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。
这里的raw data 怎么理解
raw data 就是整行的内容啊。
例如,一个表有
(id, column2, column3, ... , columnN)
这N行,那么主键索引就是:如果你只对
column2
做一个一般的索引,那么这个索引是:显然后者查询速度回比前者快得多。