mysql> select count(*) from num;
+----------+
| count(*) |
+----------+
| 9918530 |
+----------+
1 row in set (59.18 sec)
这也太恐怖了吧?
我换成了sqlite3 ,2秒搞定。
mysql> select count(*) from num;
+----------+
| count(*) |
+----------+
| 9918530 |
+----------+
1 row in set (59.18 sec)
这也太恐怖了吧?
我换成了sqlite3 ,2秒搞定。
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)
5 回答1.5k 阅读
2 回答2.2k 阅读
3 回答749 阅读✓ 已解决
1 回答1k 阅读
1 回答691 阅读✓ 已解决
1 回答991 阅读
1 回答863 阅读
不要听上面一些误导,让你count主键的,效果一样。因为mysql发现你count主键内部直接给你换成count(*)。
因为不知道你的表结构和索引状况,所以我就只能猜测一下并给出建议:
1.我猜测你用的应该不是myisam引擎,因为mysaim引擎下的count()是记录在schema表中,直接获取数字即可。如果你的count()带条件了,那么myisam也会变慢。
2.看起来好像可能你用的应该是innodb引擎,你用count(*)是正确的选择,但是它就是慢。比较好的优化方案请参考加redis或者memcache缓存,如果不想引入新的存储结构,你可以通过在mysql中建立一个冗余字段来记录总数。
你可以去读一下《高性能mysql》的相关章节。