25万条记录的count查询耗时113469 ms,求救

lEFTmOON 2008-10-16 10:55:05
表有三个字段,ID(主键,自增长),DATA(MediumText,用来保存大的纯文本,因为不确定文本长度是否会超过64K),UPDATE(INT 1,用来标记是否更新过)
索引已建立:ID、UPDATE

select count(id) from cn

显示结果为237549记录
耗时:113469 ms

另外,DATA改为TEXT是否会好一些呢?

救救啊
...全文
268 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
whalefish2001 2008-11-07
  • 打赏
  • 举报
回复
1、不同意创建临时表。
2、DATA改为TEXT,在数据量大的时候,会好一些,但是,不建议这样做。

不能为了提升速度而牺牲功能,并且这种提升也是很有限的。
wendymax 2008-11-06
  • 打赏
  • 举报
回复
创建一个临时表,在临时表中去count
flairsky 2008-11-06
  • 打赏
  • 举报
回复
MYSQL

count是瞬间出来的吧 ……
lakcy 2008-11-05
  • 打赏
  • 举报
回复
學習
whalefish2001 2008-11-03
  • 打赏
  • 举报
回复
没有看过mysql优化部分的代码,查询优化器在一定的比率时,即使建了索引,也不会用,采取的仍然是全表扫描。
你刚才的sql语句
select count(id) from cn 应该很快。
select count(id) from cn where `update`=1 由于采用的全表扫描,因此会慢。
但是,innodb类型的表比myisam类型的表还要慢。
如果不用事物的话,建议不建成 innodb 类型的表。
maskdata 2008-11-03
  • 打赏
  • 举报
回复
UPDATE为什么是INT(1)
用TINYINT(1)不是更好吗?
而且根本不用为UPDATE建索引.因为只有0和1的可能性
懒得去死 2008-10-29
  • 打赏
  • 举报
回复
好像LZ还忘记说了,她的引擎是INNODB!
I_ask_who 2008-10-29
  • 打赏
  • 举报
回复
未更新好像比较多,建一个stored procedure

declare rows_not_update int;
declare rows_update int;
declare rows_all int;
select count(id) into rows_all from cn;
select count(id) into rows_not_update from cn where 'update'=0; -- 寻找未更新的,假设其状态=0
set rows_update=rows_all-rows_notupdate;
select rows_update;
ThirstyCrow 2008-10-17
  • 打赏
  • 举报
回复
wwwwb 2008-10-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 WWWWA 的回复:]
用子查询试试,速度可能会提高
select count(id) from (SELECT ID FROM cn where `update`=1) A group by id
OR
select count(id) from (SELECT ID FROM cn where `update`=1) A
[/Quote]
两个索引都用到了
懒得去死 2008-10-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lEFTmOON 的回复:]
楼上的,抱歉,我说错了
select count(id) from cn where `update`=1
总表大概是26万条记录,`update`=1是23万条
加了where后速度下降明显,不加的时候是0ms
[/Quote]

不加的话全表扫描快。因为你的UPDATE列此时的索引是一个烂索引。也就是比FULL TABLE SCAN 的效率更低下的索引。这样的列根本就不应该建立索引,直接分表得了。

当一个索引要扫描的行数多于总表记录数50%的时候,就是烂索引
WWWWA 2008-10-16
  • 打赏
  • 举报
回复
or
select sum(iif(update=1,1,0)) from cn group by id
WWWWA 2008-10-16
  • 打赏
  • 举报
回复
用子查询试试,速度可能会提高
select count(id) from (SELECT ID FROM cn where `update`=1) A group by id
OR
select count(id) from (SELECT ID FROM cn where `update`=1) A
wwwwb 2008-10-16
  • 打赏
  • 举报
回复
select count(id) from cn where `update`=1 group by id
试试
OR
select count(id) from (SELECT ID FROM cn where `update`=1) A group by id
OR
select count(id) from (SELECT ID FROM cn where `update`=1) A
lEFTmOON 2008-10-16
  • 打赏
  • 举报
回复
楼上的,抱歉,我说错了
select count(id) from cn where `update`=1
总表大概是26万条记录,`update`=1是23万条
加了where后速度下降明显,不加的时候是0ms
aliciayao 2008-10-16
  • 打赏
  • 举报
回复
select count(id) from cn where UPDATE in(1,0);

或者把DATA里存的数据改为二进制流试下???
wwwwb 2008-10-16
  • 打赏
  • 举报
回复
select count(id) from cn group by id
or
CREATE TEMPORARY TABLE tt
select id from cn

select count(id) from tt

or
直接查询系统表此表的记录数
lEFTmOON 2008-10-16
  • 打赏
  • 举报
回复
忘记说了,数据库是MYSQL

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧