存储引擎
说一下执行一条MYSQL的全部过程?
- 客户端发起SQL请求
- 连接器负责建立连接、校验用户身份、接受SQL语句
- 查询缓存,如果命中就直接返回,如果没有命中就继续执行,在MYSQL8以上版本,取消了这一步骤
- 解析器对MYSQL语句进行语法分析和词法分析,构建语法树
- 优化器会概率计算执行成本,选择成本最小的方案执行
- 执行器根据执行计划执行语句,从存储引擎获取记录
MYSQL的存储引擎有哪些
- INNODB MYSQL的默认引擎,支持事务、行级锁、日志、回滚等,支持聚簇索引,采用索引组织表,索引和数据存在同一个文件中【B+树叶子节点存储索引+数据,适合更新
- MYISAM 只支持表锁,锁的粒度大,不支持事务,采用堆表,不支持聚簇索引,索引和数据分开存储【B+树叶子节点存储索引+数据地址,适合查询
- MEMORY 数据存在内存中,不具备持久性
COUNT(*)在MYISAM和INNODB下哪个好?
- 如果没有WHERE条件:MYISAM好,因为MYISAM由表级锁直接维护了一个META信息记录总长度
- 如果由WHERE条件,则两个都差不多
MYSQL中的行数据
每条行记录主要包含字段:变长字段列表、NULL值字段列表、记录头信息、ROW_ID(行id)、TRX_ID(事务id)、ROLL_PTR(MVCC版本日志回滚指针)、ENRTY1、ENTRY2.......
NULL值是如何存储的?
每条行记录中会有至少1B的大小记录空值情况,每列占1BIT,1就是NULL,0就是非空,当全部为NOT NULL时 ,这部分字段就不存在,节省1B空间。
CHAR和VARCHAR有什么区别?
- CHAR是固大小字符串,在结构上没有可变字段列表,比如CHAR(10),即使只占用了B,也会补充空格成占了10 B
- VARCHAR是可变大小字符串,在结构上有1-2B的可变字段列表,VARCHAR(10)如果只占用了B,那么它就只会占用5B+1-2B的可变字段列表
- VARCHAR比CHAR更节约内存
对于占用5B的数据,VARCHAR(10)和VARCHAR(100)的区别?
在结构上包含可变字段列表,所以实际占用磁盘空间是5B+(1-2)B可变字段,但是慷慨是不明智的,因为MYSQL通常会分配固定大小的内存去保存内部值,更长的列MYSQL会分配更大的内存,在排序时也会占用更大的内存。
假如硬件内存特别大,MYSQL内存能否替代REDIS?
不能
- 在查询效率上,MYSQL需要先访问页表,最好情况在有索引的情况下 访问B+树的节点,加载进内存,而REDIS天然就是面向内存设计的NOSQL,并且有很多如SKIPLIST等高效的数据结构,在这面MYSQL不如REDIS
- MYSQL是面向磁盘页设计设计的数据库,更新操作要加锁,REDIS不要,另外MYSQL为了持久化要刷盘REDOLOG日志和BINLOG日志,REDIS可以选择不持久化。