免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 19748 | 回复: 13
打印 上一主题 下一主题

innodb表select count(*) from t 速度极慢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-21 12:51 |只看该作者 |倒序浏览
mysql> select count(id) from post;
+-----------+
| count(id) |
+-----------+
| 18836 |
+-----------+
1 row in set (1.06 sec)

我的怎么慢得要死 innodb数据库
服务器配置 P4 3.0 1G
服务器基本上没有什么访问量

是innodb的问题

在select 前先运行
set autocommit=0
再select count() from t
速度是慢

转换成myisam速度马上提上去了
mysql> select count(*) f
+----------+
| count(*) |
+----------+
|    18836 |
+----------+
1 row in set (0.05 sec)

使用INNODB有啥办法可以使速度快一些呢?分页时一定要count()的,速度慢得一屁啊

MYSQL是刚刚从官方下载的5.0最新版

[ 本帖最后由 YourEyes 于 2007-11-21 12:54 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-11-21 17:01 |只看该作者
貌似在 my.cnf 中关于 innodb 的配置问题。

试着增加 innodb_buffer_pool_size 的值再试试看。

论坛徽章:
0
3 [报告]
发表于 2007-11-21 18:29 |只看该作者
应该用 show table status like 'tableName'

另 count() 在没有 where 条件的时候,mysql不会优化

论坛徽章:
0
4 [报告]
发表于 2007-11-21 20:31 |只看该作者
innodb表不像myisam,有个内置的计数器。
可以用
select count(*) from table_name where primary_key >=0

类似这样的来查询,通过
show table status

得到的结果不够准确,会随时变化,只是个大致的值

论坛徽章:
0
5 [报告]
发表于 2007-11-21 20:34 |只看该作者
原帖由 yejr 于 2007-11-21 20:31 发表
innodb表不像myisam,有个内置的计数器。
可以用

类似这样的来查询,通过
得到的结果不够准确,会随时变化,只是个大致的值

mysql> select count(*) from post where id>0;
+----------+
| count(*) |
+----------+
|    18836 |
+----------+
1 row in set (1.08 sec)

版主,没有快啊,郁闷

论坛徽章:
0
6 [报告]
发表于 2007-11-21 20:35 |只看该作者
我在搜索myisam innodb两个表的区别时,找到如下内容:
2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

难道用PHP来分页时就真的没有办法用INNODB了吗?

论坛徽章:
0
7 [报告]
发表于 2007-11-21 20:38 |只看该作者
原帖由 YourEyes 于 2007-11-21 20:34 发表

mysql> select count(*) from post where id>0;
+----------+
| count(*) |
+----------+
|    18836 |
+----------+
1 row in set (1.08 sec)

版主,没有快啊,郁闷


id是主键?有其他索引吗,用其他索引字段做条件试试看

论坛徽章:
0
8 [报告]
发表于 2007-11-21 21:49 |只看该作者
原帖由 yejr 于 2007-11-21 20:38 发表


id是主键?有其他索引吗,用其他索引字段做条件试试看

ID是主键


--------------------------------------
还真神,用了另外一个索引字段addtime竟然行了
mysql> select count(*) from post where addtime>0;
+----------+
| count(*) |
+----------+
|    18836 |
+----------+
1 row in set (0.03 sec)


怪了,为啥使用 primary key 却不行呢?
表结构如下:

CREATE TABLE `post` (
  `id` int(11) NOT NULL auto_increment,
  `catid` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `content` text NOT NULL,
  `addtime` varchar(10) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `addtime` (`addtime`),
  KEY `catid` (`catid`)
) ENGINE=InnoDB  DEFAULT CHARSET=gbk AUTO_INCREMENT=19226 ;

[ 本帖最后由 YourEyes 于 2007-11-21 22:36 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-11-22 12:48 |只看该作者
原帖由 YourEyes 于 2007-11-21 21:49 发表

ID是主键


--------------------------------------
还真神,用了另外一个索引字段addtime竟然行了
mysql> select count(*) from post where addtime>0;
+----------+
| count(*) |
+----------+
| ...



innodb用主键进行检索时,使用像上面的条件的话,mysql会坐一次全表扫描,所以和不加条件区别不大.
如果有其他索引,尤其是唯一索引,那效果会好很多.

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-03-12 06:20:00
10 [报告]
发表于 2007-11-22 17:56 |只看该作者
InnoDB是事务型, 当然慢了
哪怕你用Oracle,这句话还是慢,全表扫
后加一个条件,就是走个索引,不会全表扫,速度当然快
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP