select count(*)的时间太长了吧?

mysql> select  count(*) from num;
+----------+
| count(*) |
+----------+
|  9918530 |
+----------+
1 row in set (59.18 sec)

这也太恐怖了吧?
我换成了sqlite3 ,2秒搞定。

阅读 9.8k
7 个回答

不要听上面一些误导,让你count主键的,效果一样。因为mysql发现你count主键内部直接给你换成count(*)。

因为不知道你的表结构和索引状况,所以我就只能猜测一下并给出建议:

1.我猜测你用的应该不是myisam引擎,因为mysaim引擎下的count()是记录在schema表中,直接获取数字即可。如果你的count()带条件了,那么myisam也会变慢。

2.看起来好像可能你用的应该是innodb引擎,你用count(*)是正确的选择,但是它就是慢。比较好的优化方案请参考加redis或者memcache缓存,如果不想引入新的存储结构,你可以通过在mysql中建立一个冗余字段来记录总数。

你可以去读一下《高性能mysql》的相关章节。

MySQL高性能第三版
第六章 236页
已经千万条数据了,不应该这么统计

MyISAM引擎下会有自动维护这个的,可以更快。

mysql> describe num;
Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
adsh varchar(20) NO NULL
tag varchar(256) NO NULL

10 rows in set (0.49 sec)

mysql> select count(id) from num;
count(id)
9918530

1 row in set (46.95 sec)

mysql> select count(adsh) from num;
count(adsh)
9918530

1 row in set (30.91 sec)

mysql> select count(tag) from num;
count(tag)
9918530

1 row in set (27.54 sec)

mysql> ALTER TABLE num ENGINE = 'MYISAM';
Query OK, 9918530 rows affected (3 min 5.07 sec)
Records: 9918530 Duplicates: 0 Warnings: 0

mysql> select count(*) from num;
+----------+
| count(*) |
+----------+
|  9918530 |
+----------+
1 row in set (0.02 sec)

为啥可变长度类型查询速度比主键还快?

mysql开启查询缓存,这个肯定不要2秒。如果写入很少的话,开启查询缓存吧

新手上路,请多包涵

内存库比数据库读IO速度快,有问题吗?sqlite比mysql慢才奇怪

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题