14 | count(*)这么慢,我该怎么办?

1 MyISAMYSQL把表总函数存在了磁盘中 , count(*) 直接返回 , 但是where则不能直接返回
2 InnoDB 需要一行一行读出来 , 累计计数
3 事务支持, 并发能力 , 数据安全 innodb >>>>>> myisam
4 由于MVCC的存在 , innodb也不确定该返回多少行 (频繁读写 , 并发的情况下 )
5 一个并发读写 , count的场景 : 并发情况下 , 其他事务插入的行在当前事务下并不可见 , 否则就是幻读了 , 因此innodb只能一行一行检查并统计
6 为了尽量减少扫描数据量 , 优化器会选择最小的一颗索引树
7 数据库设计的一个通用法则 : 减少扫描数据量
8 show table status 里的TABLE_ROWS 也是采样统计结果 , 不准奥
9

  • MyISAM表虽然count(*)很快,但是不支持事务;
  • show table status命令虽然返回很快,但是不准确;
  • InnoDB表直接count(*)会遍历全表,虽然结果准确,但会导致性能问题。

10 用redis计数 , 问题 :
断电 , 丢失了 . 解决: 重启后重新数据库count读取
11 mysql和redis同时使用的并发问题 : 在写mysql 和 redis+1 的中间的操作出现了不一致的情况
12 不一致容易穿插在读写,写读,写写之间
13 只存mysql , 解决知识点10的崩溃丢失问题 , 参考第二讲
14 解决方法还是事务 , 保持原子 , 隔离 一致
15 count()函数的定义 , 对于返回的结果集,一行行的判断 , 如果参数不是NULL则+1 , 否则不加
16 count() 是有特殊优化过的 , 用就对了
17 count(主键) 会遍历整张表,每一行的id值取出来
18 count(1) 也会遍历 , 但不取值 , 而是把数字1放进去 , 1永远不可能为空 , 所以…
19 总之 count(字段)_
20 redis和mysql是两个不同的存储系统 , 不支持构成分布式事务 , 没有形成事务 , 无法形成一致的视图
21

你可能感兴趣的:(14 | count(*)这么慢,我该怎么办?)