SQL隐式转换导致索引失效_校验规则不一致
4.校验规则不一致导致索引失效
首先可以通过检查表的校验规则核实是否存在隐式转化。
--查看关联字段的字符集、校验规则
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM information_schema.COLUMNS
WHERE ...;
核实为校验规则导致的索引失效,其处理手段和字符集导致索引失效基本一致。可以通过修改表结构和修改 SQL 两种情况处理。如果通过修改 SQL 处理,可以通过直接在关联字段后面跟 COLLATE 校验规则 即可,例如:
SELECT lu.user_id, lu.phone, lu.nick_name, lu.head_img, lu.gender
, lu.birthday, lu.status, lu.ctime AS reg_time, luc.ctype, luc.channel_code
, lcc.name AS channel_name, luc.source_id, luw.nickname AS wx_nick_name, luw.unionid
FROM XX lu
LEFT JOIN (
SELECT r.*
FROM XXX r
WHERE r.is_delete != 1
GROUP BY r.phone
) luw
ON lu.phone = luw.phone
LEFT JOIN XXXX luc ON luc.user_id = lu.user_id
LEFT JOIN XXXXX lcc ON lcc.channel_code = luc.channel_code COLLATE utf8_general_ci
WHERE 1 = 1
AND lu.user_id = 8994231
LIMIT 0, 2
三、总结
1.索引失效可能导致 SQL 执行效率大大降低。因此当怀疑出现隐式转换的时候,可以通过 show warnings 核实一下,是否出现相应的提醒。
2.当出现隐式转换,可以先通过使用 cast、convert 函数自行核实一下,是否可以进行相应的优化。
3.有些 SQL 可能存在多种隐式转换,需要核实表结构具体情况,进行相应的 SQL 改写。改写时需注意,一定要将函数加在驱动表上,如果加到被驱动表上,会因为索引列上加索引导致索引失效,被驱动表会进行全表扫描。