上周遗留问题
联合索引:多列一起作为索引,比较时遵循最左前缀原理。
索引最左前缀原理:先比第一个列(name),若第一个相同再往后比。必须从第一个开始比,不能跳过索引中的列。
关键:索引按序排序。
下图为例,只有第一个可以走联合索引。
因为从第二个(age)开始,他都没排好序,肯定走不了索引。
week 2
一:一条sql 怎么走?
连接器(服务层)
1.客户端通过链接器链接数据库:输入数据库IP地址,用户名,密码。新建链接后load user表里面查有没有该用户,该用户有啥权限。以后每次操作要校验有没有相应权限。
p.s.新建链接才会load权限。
2.查询的话先去缓冲区里面根据key查找有没有数据(缓存区里面的数据也是key-value);有就返回,没有去词法分析器
3.词法分析器:看sql语句对不对
4.优化器:看有没有走索引,假如join两个表,先走有索引的表。
5.执行器:调用引擎借口,获取查询结果。
数据库引擎按插件形式给服务层用,扩展性好。
可以根据表格对应设计的引擎去调用引擎接口,引擎去磁盘取数据。取到数据把返回执行器,这时可以存到缓存里面。
什么时候更新缓存?
更新数据需要清理缓存,更新频繁不用缓存,因为命中低。
所以读多写少时候用缓存。
(mysql8查询缓存被移除了。。因为查询缓存的效果取决于缓存的命中率,只有命中缓存的查询效果才能有改善,因此无法预测其性能。)
query_cache_type 看用不用缓存,参数0,1,2
0:都不用
1:都用
2:按需缓存 ,例如读特殊列,那么缓存结果。
eg:select SPE * from test
show status like "%Qcache%" 可以查看状态、命中等
二:Bin log 归档日志(逻辑日志)
服务层实现的,所有引擎公用
记录的是语句的原始逻辑,也就是过程
看bin log 开启了没:show variables like '%log_bin%'
flush logs 可以新建文件监控以后的过程
end_log_pos 记录了每次操作(节点)
可以根据timestamp(节点)或者pos序号恢复,具体操作指令可以百度。
就是指定节点恢复数据。