1、 等价转换
instr:字符串查找函数
css
INSTR(string, substring [, start_position [, occurrence [, return_option]]])
string: 源字符串
substring: 要查找的子串
start_position: 可选,开始搜索的位置(默认1,负数表示从末尾开始)
occurrence: 可选,指定查找第几次出现(默认1)
return_option: 可选,0=返回子串起始位置,1=返回子串结束位置
substr: 字符串截取函数
css
SUBSTR(string, start_position [, length])
string: 源字符串
start_position: 开始位置(正数从开头,负数从末尾)
length: 可选,要截取的长度(默认到字符串结尾)
LIKE:模糊匹配
其三者之间的转换

2、 问题语句

这里问题在于驱动表为t2,index join次数100万次,前面说过与substr和instr可以等价转换,这里想要转换驱动表,那么就需要用substr。
3、 改写

这里与预期的一样驱动表变为t1表,index join次数降下来,另外注意的是,susbtr获取定长的情况下才做index join,因此这里结合业务可以知道是获取4个字节长度。执行时间从原来的10s下降到0.5s
如果是不定长,大家可以感受一下

这里没有做成index join,而是做成nest loop,反而效率下降了。
4、 小结
(1)Like、substr和instr之间可以相互转换。
(2)substr获取是定长的字符串时可以利用索引做索引连接。
(3)性能优化改写主要是针对问题去找到更加高效的方法去实现。