mysql|统计比较
count效率比较
在不同的 MySQL 引擎中,count(*)
有不同的实现方式。
- MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行
count(*)
的时候会直接返回这个数,效率很高; - InnoDB 引擎就麻烦了,它执行
count(*)
的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。
这里需要注意的是,我们在这里讨论的是没有过滤条件的count(*)
,如果加了where条件的话,MyISAM 表也是不能返回得这么快的。
记录所学所思所想,专注于Go语言、软件架构
在不同的 MySQL 引擎中,count(*)
有不同的实现方式。
count(*)
的时候会直接返回这个数,效率很高;count(*)
的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。这里需要注意的是,我们在这里讨论的是没有过滤条件的count(*)
,如果加了where条件的话,MyISAM 表也是不能返回得这么快的。
MySQL数据库共有四种类型的日志:Error Log、General Query Log、Slow Query Log 和 Binary Log
Error Log 即 错误日志,主要是记录 mysqld 发生的一些错误。
General Query Log 即 一般查询日志,记录 mysqld 正在做的事情,如客户端的连接和断开、来自客户端每条 Sql Statement 记录信息;因为查询日志会记录用户所有的操作,其中还包括增删改查等信息,如果在高并发的环境下会产生大量的信息,导致不必要的磁盘IO,会影响mysql的性能。该类型日志影响性能,所以默认是关闭的。
……view,它是一个用查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果。
另一个是 InnoDB 在实现 MVCC 时用到的一致性读视图,即 consistent read view,用于支持 RC(Read Committed,读提交)和 RR(Repeatable Read,可重复读)隔离级别的实现。
……全局锁就是对整个数据库实例加锁。
MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock
当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
……索引的出现是为了提高数据的查询效率,就行书本的目录一样,mysql中索引的实现是基于存储引擎的。
说明:以键值存储的数据结构 问题:哈希冲突的处理 范围:适用于等只查询的场景
……当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做,
……
MySQL 可以分为 Server 层和存储引擎层两部分。Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
……方便记忆秘诀——“一次缘分”
……相同点
……