前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql 联合表查询从表即使有索引依然ALL的一个原因-索引ALL解决,字符编码方式不一致导致全表搜索 mysql索引失效,是因为charset不一致导致 mysql索引 适用 字符类型一致

mysql 联合表查询从表即使有索引依然ALL的一个原因-索引ALL解决,字符编码方式不一致导致全表搜索 mysql索引失效,是因为charset不一致导致 mysql索引 适用 字符类型一致

作者头像
oktokeep
发布2024-10-09 10:55:55
690
发布2024-10-09 10:55:55
举报
文章被收录于专栏:第三方工具

mysql 联合表查询从表即使有索引依然ALL的一个原因-索引ALL解决,字符编码方式不一致导致全表搜索 那就是主表和从表的关联字段的编码方式不一样!!!

mysql索引失效,是因为charset不一致导致 mysql索引 适用 字符类型一致

产生的现象:

解决之后,正确的使用了t2.order_no ref索引,而不是ALL

检查mysql主体编码方式,是否由于后来新建的表的关联字段和之前的主表的字段的编码方式不一样 改成一样的编码方式以后就ok了

#可以通过以下排查解决:

代码语言:javascript
复制
#查看数据库编码格式
SHOW VARIABLES LIKE 'character_set_database';


#修改
#删除重新指定
CREATE DATABASE testDb CHARACTER SET utf8;
CREATE TABLE testTable(order_no VARCHAR(32) NOT NULL) DEFAULT CHARSET = utf8;

# 查看数据表的编码格式
SHOW CREATE TABLE testTable;
SHOW FULL COLUMNS FROM testTable;


#直接修改
#1、数据库修改
ALTER DATABASE testDb CHARACTER SET utf8;
#2、数据表修改
ALTER TABLE testTable CHARACTER SET utf8;  # UTF8MB3
ALTER TABLE testTable CHARACTER SET utf8mb4;

#3、表字段修改
ALTER TABLE testTable CHANGE order_no order_no VARCHAR(32) CHARACTER SET utf8 NOT NULL;
ALTER TABLE testTable CHANGE order_no order_no VARCHAR(32) CHARACTER SET utf8mb4 NOT NULL;

utf8_general_ci utf8mb4_general_ci MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。

SQL语句语法:如果没有正确的使用到索引,需要检查SQL语句是否正确,以下是DEMO:

简单介绍:order仅仅有order_no索引,multiple既有order_no索引,又有create_time索引

#t1仍然是ALL,因为where条件也跟它无关,且order是大表,主要查询业务的数据作为主表,其他的作为从表。

#t1是ALL索引 EXPLAIN SELECT * FROM `order` t1 use index (order_no) LEFT JOIN `multiple` t2 on t1.`order_no` =t2.`order_no` where t1.`create_time` >= '2023-06-01 00:00:00' and t1.`create_time` <= '2023-06-30 23:59:59';

#t1是ALL索引

EXPLAIN SELECT * FROM `order` t1 force index (order_no) LEFT JOIN `multiple` t2 on t1.`order_no` =t2.`order_no` where t1.`create_time` >= '2023-06-01 00:00:00' and t1.`create_time` <= '2023-06-30 23:59:59';

#t1是ref索引

EXPLAIN SELECT * FROM `order` t1 force index (order_no) LEFT JOIN `multiple` t2 on t1.`order_no` =t2.`order_no` where t2.`create_time` >= '2023-06-01 00:00:00' and t2.`create_time` <= '2023-06-30 23:59:59';

#t2是ref索引 EXPLAIN SELECT * FROM `multiple` t1 LEFT JOIN `order` t2 on t1.`order_no` =t2.`order_no` where t1.`create_time` >= '2023-06-01 00:00:00' and t1.`create_time` <= '2023-06-30 23:59:59';

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档