SQL隐式转换导致索引失效_校验规则不一致

梦莱2年前技术文章600

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 改写。改写时需注意,一定要将函数加在驱动表上,如果加到被驱动表上,会因为索引列上加索引导致索引失效,被驱动表会进行全表扫描。


相关文章

Linux解锁线程基本概念和线程控制,步入多线程学习的大门(2)

Linux解锁线程基本概念和线程控制,步入多线程学习的大门(2)

2.4.线程等待:为什么需要线程等待?已经退出的线程,其空间没有被释放,仍然在进程的地址空间内。不然也会造成内存泄露问题!创建新的线程不会复用刚才退出线程的地址空间。主线程退出 == 进程退出 ==...

Hive优化之配置参数的优化(一)

Hive优化之配置参数的优化(一)

 Hive是大数据领域常用的组件之一,主要是大数据离线数仓的运算,关于Hive的性能调优在日常工作和面试中是经常涉及的一个点,因此掌握一些Hive调优是必不可少的一项技能。影响Hive效率的...

HDFS Fsimage分析磁盘目录(文件级别)

HDFS Fsimage分析磁盘目录(文件级别)

首先获取fsimage信息hdfs dfsadmin -fetchImage  /opt/fsimage格式化fsimage 转换为可读文本hdfs oiv -i /opt/fsimage/fsima...

kubernetes dashboard

kubernetes dashboard

1、背景Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。你可...

mysql 导出 csv 参数 secure_file_priv 设置

mysql 导出 csv 参数 secure_file_priv 设置

一、功能secure_file_priv 参数是用来限制数据导入和导出操作的效果,例如由LOAD data和SELECT…INTO OUTFILE语句和LOAD_FILE()函数。只有具有“FILE”...

kubernetes集群清理

清理如果你在集群中使用了一次性服务器进行测试,则可以关闭这些服务器,而无需进一步清理。你可以使用 kubectl config delete-cluster 删除对集群的本地引用。但是,如果要更干净地...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。