隐式类型转换

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)

参考)

  1. 就是利用二级索引(非聚集索引)让serverwhere条件,下沉到存储引擎层去过滤,得到较少的合适的记录主键,然后engine逐个去执行回表(可能有io)获取完整记录的数据就少了,然后返回给server层就拿到了较少的符合规则的数据。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/118468/1610443502563-50d4f9f0-8180-4d91-98c5-a06e72c54e46.png#align=left&display=inline&height=299&margin=%5Bobject%20Object%5D&name=image.png&originHeight=335&originWidth=750&size=80384&status=done&style=none&width=669)<br />
  • explain的Extra列有一个Using index condition,表示使用了ICP。
  • 注意回表是判断条件拿到一个后就去回,不是所有id拿到后采取回表统一查。
  • 不统一查的理由是:减少每次拿到完整记录的数量。

  1. 而正常如果不用ICP,是从引擎层获取一条完整记录,返回到server层的采用where条件过滤后,如果符合就保留,写入client-socket缓存,否则丢弃,然后向engine再取下一条记录。

image.png

  • expain的extra列有using where表示有未使用icp的条件,是在server层过滤数据。

所以icp技术能减少io次数,提高查询性能。