BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / database / #6554同步于 2012/5/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖

InnoDB存储引擎的数据库表执行SELECT的读操作遇到的问题

zhihao
2012/5/2镜像同步8 回复
数据库中有张Item表,表引擎是InnoDB,表的数据量在100万。现在有三台机子同时往这张表执行插数据的操作。同时我在MySQL的命令行执行SELECT count(*) from item的读操作,该指令执行了12分钟才返回item表中存储的数据项。该服务器的配置为中等偏上。为什么这里执行的读操作会这么迟缓?InnoDB的存储引擎不是执行的是一致性非锁定读的服务吗?为什么读操作会执行得这么慢,而且仅仅是一百万条数据,求大虾水水原因
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
fishbone机器人#1 · 2012/5/3
innodb不熟悉, 不过我估计如果没有合适的索引的话, 要走全表扫描, 看一下这个查询进程的执行状态,可能是io花费了很多时间. 如果要得到表中的记录数, 应该有什么现成的统计信息可以参考吧. 比如sql server中的 sp_spaceused之类的函数.
Robberking机器人#2 · 2012/5/3
这个 count SQL 没有where clause, 表上是否有主键?如果有主键的话,应该从主键中读出这个值。如果没有从主键读取,你可以发新给 mysql developer 修改这个问题。 【 在 zhihao 的大作中提到: 】 : 数据库中有张Item表,表引擎是InnoDB,表的数据量在100万。现在有三台机子同时往这张表执行插数据的操作。同时我在MySQL的命令行执行SELECT count(*) from item的读操作,该指令执行了12分钟才返回item表中存储的数据项。该服务器的配置为中等偏上。为什么这里执行的读操作会这么迟缓?InnoDB的存储引擎不是执行的是一致性非锁定读的服务吗?为什么读操作会执行得这么慢,而且仅仅是一百万条数据,求大虾水水原因
zhihao机器人#3 · 2012/5/3
【 在 Robberking 的大作中提到: 】 : 这个 count SQL 没有where clause, 表上是否有主键?如果有主键的话,应该从主键中读出这个值。如果没有从主键读取,你可以发新给 mysql developer 修改这个问题。 : 我读的是主键,在没有数据插入的情况下执行时间是0.6秒,是不是在写数据的时候IO被占用了?是操作系统层面的局限吗?
Robberking机器人#4 · 2012/5/3
你的系统 隔离级别 设的是什么?如果是 sequence 的,需要等之前的 query 执行完。mysql 有一个 profile 功能,你看看时间都浪费在什么地方。 【 在 zhihao 的大作中提到: 】 : : : 我读的是主键,在没有数据插入的情况下执行时间是0.6秒,是不是在写数据的时候IO被占用了?是操作系统层面的局限吗?
zhihao机器人#5 · 2012/5/3
【 在 Robberking 的大作中提到: 】 : 你的系统 隔离级别 设的是什么?如果是 sequence 的,需要等之前的 query 执行完。mysql 有一个 profile 功能,你看看时间都浪费在什么地方。 : 我设的是repeatable read. 好的,我先去跟踪一下
wulin机器人#6 · 2012/5/6
为什么大家都不喜欢用MyISAM引擎呢? 【 在 zhihao 的大作中提到: 】 : 数据库中有张Item表,表引擎是InnoDB,表的数据量在100万。现在有三台机子同时往这张表执行插数据的操作。同时我在MySQL的命令行执行SELECT count(*) from item的读操作,该指令执行了12分钟才返回item表中存储的数据项。该服务器的配置为中等偏上。为什么这里执行的读操作会这么迟缓?InnoDB的存储引擎不是执行的是一致性非锁定读的服务吗?为什么读操作会执行得这么慢,而且仅仅是一百万条数据,求大虾水水原因
wulin机器人#7 · 2012/5/6
InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。 【 在 zhihao 的大作中提到: 】 : 数据库中有张Item表,表引擎是InnoDB,表的数据量在100万。现在有三台机子同时往这张表执行插数据的操作。同时我在MySQL的命令行执行SELECT count(*) from item的读操作,该指令执行了12分钟才返回item表中存储的数据项。该服务器的配置为中等偏上。为什么这里执行的读操作会这么迟缓?InnoDB的存储引擎不是执行的是一致性非锁定读的服务吗?为什么读操作会执行得这么慢,而且仅仅是一百万条数据,求大虾水水原因
zhihao机器人#8 · 2012/5/6
【 在 wulin 的大作中提到: 】 : InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。 哦,我再去看看,用InnoDB主要是为了级联保存删除,可以方便维护数据的一致性。就是为了偷点小懒