隐式类型转换
mysql里字符串和数字做比较,是将字符串转成数字。
整型字段,如果int_field > “10”,会将”10”转换成10来比较。
字符串字段,如果string_field > 10,会将string_field转换成int_field来比较,也就是使用了类型转换函数cast(string_field as signed int),所以此时字段不会使用索引搜索树。
隐形字符集
两个字符集不同的字段join或比较,会往长度变长的字符集转换,然后join或比较,比如convert(field_name using utf8mb4)。
正常情况下,如果两字符集相同,并且建立了索引,会正常走索引搜索树。
但此时使用了函数,在该字段上不会走索引搜索树,即不走索引,会全遍历表然后逐行取字段并转换字符集再join或比较。所以就慢。
非等值查询的索引下推技术(ICP=Index Condition Pushdown)
参考)
就是利用二级索引(非聚集索引)让server的where条件,下沉到存储引擎层去过滤,得到较少的合适的记录主键,然后engine逐个去执行回表(可能有io)获取完整记录的数据就少了,然后返回给server层就拿到了较少的符合规则的数据。<br /><br />
- explain的Extra列有一个Using index condition,表示使用了ICP。
- 注意回表是判断条件拿到一个后就去回,不是所有id拿到后采取回表统一查。
- 不统一查的理由是:减少每次拿到完整记录的数量。
而正常如果不用ICP,是从引擎层获取一条完整记录,返回到server层的采用where条件过滤后,如果符合就保留,写入client-socket缓存,否则丢弃,然后向engine再取下一条记录。

- expain的extra列有using where表示有未使用icp的条件,是在server层过滤数据。
所以icp技术能减少io次数,提高查询性能。
