该文章提到的是问题
有一个知识点就是不一定left join的左边就一定是驱动表,就比如左边如果查询的列是有索引的,那么在使用索引的情况下,右边的表应该是驱动表
对于SNL和BNL的区别在于,对于被驱动表的匹配条件一个是每一行会先在buffer pool中进行查找,没有就去磁盘中取,另一个就是先全部取到内存中
在从磁盘中读取文件到内存中的这个操作中,对于被驱动表的数据进行多次访问,然后就会导致,这样超过一秒的话,数据就更容易放到buffer pool的头部,即使被驱动表的数据都在内存,每次的访问也是类似于指针操作,比不上join_buffer中的数组更快
distinct和 group by的操作性能一致
执行的语句就是开一个临时表,对于全表进行遍历,给查询字段加上唯一索引,然后遍历表,对于数据取出之后插入到临时表中,,如果临时表出现唯一键冲突就跳过,否则就插入成功,遍历完成之后就返回给客户端
对于备库自增主键的问题,对于insert_id=某个值的时候,如果A早于B但是提交的时候B早于A的话,binlog就会更早,然后再主从的时候,如果你是处于binlog_format=statement的时候,应为只记录一条语句,就会导致语句A的id和语句B的id插入的顺序反过来了,导致数据出现问题,但是如果你使用的binlog_format=row格式的话,再每条语句执行前,会加入一个set statement=id的格式来明确表示,接下来的语句的自增id填哪一个,所以就可以保证不会出错
对于left join ... where ...这句话的话,会转换成join ... where ...
还有一个小知识点就是,dinstinct的去重,每次都是拿到主键第一的位置的行数据,也就说,a=1有3行,就拿出主键id最小的放到临时表中