作者回复: 1. 好问题,而且你做了个不错的对照实验。是的,加了limit 1 能减少扫描多少行,其实优化器也不确定,【得执行才知道】,所以显示的时候还是按照“最多可能扫多少行”来显示。
2. 你这个例子里,如果确实是按照b扫描了,应该肯定是ID最大值呀,除非ID最大的那个记录,a条件不满足。但是一定是“满足a条件里面最大的那个ID的”,你再验证下。
而如果是用了a, 那就有临时表排序,临时表排序有三种算法,还分内存还是磁盘临时表… 这里展开不了了,后面《order by是怎么工作的》这篇会讲。
作者回复: 啊,误会了,确实是哪个索引的基数就是在哪个索引树上拿的。
你的理解是对的,我文中也是这个意思哦😓
作者回复: Session A提交早了… 从上到下按照时间顺序执行哈
作者回复: 👍🏿
作者回复: 👍🏿
而且发评论的时候还做了很细致地脱敏,赞
作者回复: ………
不会吧,插入10万条27分钟… 你把innodb_flush_log_at_trx_commit 和 sync_binlog都设置成0试试
作者回复: 👍🏿
作者回复: 是,已经修改了,谢谢。
删除的时候是标记删除,所以很快。
建索引是要扫描数据和真正生成索引树,是会慢些
作者回复: 好问题
where A in (a,b,c) AND B in (x,y,z)
会转成
(A=a and B=x) or (A=a and B=y) or (A=a and B=z) or
(A=b and B=x) or (A=b and B=y) or (A=b and B=z) or
(A=c and B=x) or (A=c and B=y) or (A=c and B=z)
作者回复: 是的,你提到的这些,都在server层
很早之前连过滤数据都在server层,后来有了index condition pushdown下推了一点到引擎层
作者回复: 其实这篇主要就是说优化器的bug😄 bug嘛就没什么道理😓
作者回复: 准确。
悄悄地我涨了一点信心😄