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

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

检查mysql主体编码方式,是否由于后来新建的表的关联字段和之前的主表的字段的编码方式不一样
改成一样的编码方式以后就ok了
#可以通过以下排查解决:
#查看数据库编码格式
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';

mysql 联合表查询从表即使有索引依然ALL的一个原因-索引ALL解决,字符编码方式不一致导致全表搜索的更多相关文章
- mysql 联合表查询从表即使有索引依然ALL的一个原因
那就是主表和从表的关联字段的编码方式不一样!!! 晕啊,折腾了半天才发现,可能是不知道啥时候mysql更改主体编码方式了,结果导致后来新建的表的关联字段和之前的主表的字段的编码方式不一样 改成一样的编 ...
- Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题
Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题 表更描述: 将mysql数据库中的worktask表添加ishaspic字段. 具体操作:(1)数据库worktask表新添是否有图片字 ...
- 对于大量left join 的表查询,可以在关键的 连接节点字段上创建索引。
对于大量left join 的表查询,可以在关键的 连接节点字段上创建索引. 问题: 大量的left join 怎么优化 select a.id,a.num,b.num,b.pcs,c.num, c. ...
- mysql不会使用索引,导致全表扫描情况
不会使用索引,导致全表扫描情况 1.不要使用in操作符,这样数据库会进行全表扫描,推荐方案:在业务密集的SQL当中尽量不采用IN操作符 2.not in 使用not in也不会走索引推荐方案:用not ...
- 如何优雅的使用 参数 is null而不导致全表扫描(破坏索引)
相信大家在很多实际业务中(特别是后台系统)会使用到各种筛选条件来筛选结果集 首先添加测试数据 ), Age INT) go CREATE INDEX idx_age ON TempList (Age) ...
- 11月28日内容总结——多表查询的两种方法及部分小知识点、可视化软件Navicat安装及简单使用讲解及多表查询练习题、python代码操作MySQL(pymysql模块)
目录 一.多表查询的两种方法 方式1:连表操作 inner join(内连接) left join(左连接) right join(右连接) union(全连接) 方式2:子查询 二.小知识点补充说明 ...
- Oracle收集对表收集统计信息导致全表扫描直接路径读?
direct path read深入解析 前言 最近碰到一件很奇葩的事情,因为某条SQL执行缓慢,原因是走了笛卡尔(两组大数据结果集),而且笛卡尔还是NL的一个部分,要循环31M次. 很容易发现是统计 ...
- mysql中设置默认字符编码为utf-8
使用过Linux的同志就知道,在Linux下安装mysql,尤其是使用yum安装的时候,我们是没法选择其默认的字符编码方式.这个就是一个比较头痛的问题,如果Linux数据库中使用到中文的时候,乱码问题 ...
- MySQL多表查询合并结果union all,内连接查询
MySQL多表查询合并结果和内连接查询 1.使用union和union all合并两个查询结果:select 字段名 from tablename1 union select 字段名 from tab ...
- MYSQl 全表扫描以及查询性能
MYSQl 全表扫描以及查询性能 -- 本文章仅用于学习,记录 一. Mysql在一些情况下全表检索比索引查询更快: 1.表格数据很少,使用全表检索会比使用索引检索更快.一般当表格总数据小于10行并且 ...
随机推荐
- 网易游戏基于 Flink 的流式 ETL 建设
简介: 网易游戏流式 ETL 建设实践及调优经验分享- 网易游戏资深开发工程师林小铂为大家带来网易游戏基于 Flink 的流式 ETL 建设的介绍.内容包括: 专用 ETL EntryX 通用 ETL ...
- Java面试题:SimpleDateFormat是线程安全的吗?使用时应该注意什么?
在日常开发中,我们经常会用到时间,我们有很多办法在Java代码中获取时间.但是不同的方法获取到的时间的格式都不尽相同,这时候就需要一种格式化工具,把时间显示成我们需要的格式. 最常用的方法就是使用Si ...
- 【强化学习】Markov Decision processes【二】
目录 Markov Decision processes Markov Process Markov reward process Markov Decision processes 马尔可夫决策过程 ...
- pikachu靶机练习平台-xss
第一题:反射性xss(get) 输出的字符出现在url中 第二题:反射性xss(post) 登录后输入<script>alert(1)</script> 第三题:存储型xss ...
- leaflet叠加图片图层
<!DOCTYPE html> <html> <head> <title>Layers Control Tutorial - Leaflet</t ...
- C语言中四舍五入问题总结
C语言中四舍五入问题的总结 在C语言中大部分情况下都是不需要四舍五入的. 除了一种情况:在使用输出函数 printf()限制浮点型输出的小数位个数 eg: printf("%0.2f&quo ...
- C语言:输入一个整数并让其逆反输出。123->321
主要思想为: a)计算输入的位数有多少个 b)计算出最高位的单位(若最高位为是万位, 那么需要一个变量存储最高位数值1000) c)用取模的方法从个位数开始进行取出每一个单位上的数字 d)从个位数开始 ...
- java学习之旅(day.04)
运算符 算术运算符:+ ,- ,* ,/,%(取余或模运算), ++(自增),-- (自减) 赋值运算符:= 关系运算符:>, <,>=, <=, ==, !=(不等于),in ...
- MySql类型转换函数cast
这两天处理一个现网的MySQL慢查询工单,学到了一个好用的MySQL函数:cast.事情是这样的: 我们有两张表 t_user 和 t_rule 表,需要关联这两张表去查询,关联字段是 t_user ...
- call failed:, {"errMsg": "canvasToTempFilePath:fail invalid viewId"}苹果设备保存离屏 canvas 问题
call failed:, {"errMsg": "canvasToTempFilePath:fail invalid viewId"}苹果设备保存离屏 can ...