mysql之 in的优化
在 innodb 情况下我们查询一个语句mysql 在查询优化器会对我们写的语句会做优化,比如select * from tableA AS A where A.colum in(select * from tableB ) 我们把 select * from tableB 查询结果作为结果集B,这个情况叫做行子查询 ,我们都知道它会先执行 select * from tableB 这个语句,然后会优化成 A.colum=B.colum 假如我们colum这个字段有索引的情况下 结果集有10行就是每次都是对A表做10次回表,但是假如这个查询的结果集有10w行呢,那会不会进行10w次回表呢,答案是不会,mysql对in进行特殊的优化,就是在基于内存产生一个创建一个使用哈希索引的临时表结果表,这个过程会对结果表进行去重,这个一个过程又叫做物化,那么我们的查询过就会变得非常的快,优化过后查询的结果集就变成先会去扫描tableA过程中的colum列的值,然后然后作为结果去和物化表作为比对,然后这个表结果集又是去重过后的的哈希索引,不会产生hash碰撞,就会查询非常快,