深入理解select count(*)底层究竟做了什么
A:从 MVCC 机制与行可见性题目中可获得缘故起因,每个事宜所看到的行也许是纷歧样的,其 count( * )功效也也许是差异的;反过来看,则是 MySQL-Server 端无法在统一时候对全部用户线程提供一个同一的读视图,也就无法提供一个同一的 count 值。
个中 1、2 对付 Server 而言都是全局可能说可控的,只有 3 是每个用户线程中事宜所独占的属性,这是 Server 端不行控的身分,因此 Server 端也就对每个 COUNT( * ) 功效不行控了。 Q:InnoDB-COUNT( * ) 属 table scan 操纵,是否会将现有 Buffer Pool 中其余用户线程所需热门页从 LRU-list 中挤占掉,从而其余用户线程还需从磁盘 load一次,溘然加重 IO 耗损,也许对现有哀求造成阻塞? A:MySQL 有这样的优化计策,将扫表操纵所 load的 page 放在 LRU-list 的 oung/old 的接壤处 ( LRU 尾部约 3/8 处 )。这样用户线程所需的热门页如故在 LRU-list-young 地区,而扫表操纵不绝 load 的页则会不绝冲刷old地区的页,这部门的页自己就是被以为非热门的页,因此也相对切合逻辑。
Q:InnoDB-COUNT( * ) 是否会像 SELECT * FROM t 那样读取存储大字段的溢出页(假如存在)? A:否。由于 InnoDB-COUNT( * ) 只必要数行数,而每一行的主键必定不是 NULL,因此只必要读主键索引页内的行数据,而无需读取特另外溢出页。
【编辑保举】
点赞 0 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |