案例:SQL无法走索引,字符集以及编码不一致如何处理

简介:

1.执行计划:

SELECT * FROM `table1` WHERE  `uuid`  in( SELECT uuid FROM table2 WHERE project_create_at != "0000-00-00 00:00:00" )

+--------------------+----------------+-----------------------+-------------------+----------------+-------------------------------------------------------------------+
| table              | type           | key                   | key_len           | rows           | Extra                                                             |
+--------------------+----------------+-----------------------+-------------------+----------------+-------------------------------------------------------------------+
| table2             | range          | idx-project-create-at | 6                 | 51             | Using index condition; Start temporary                            |
| table1             | ALL            |                       |                   | 1934595        | Using where; End temporary; Using join buffer (Block Nested Loop) |
+--------------------+----------------+-----------------------+-------------------+----------------+-------------------------------------------------------------------+

执行计划上查看是type 全表扫描。
那么来查看下结构:

CREATE TABLE `table2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uuid` varchar(128) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT 'UUID',
   xxxxxx 
  PRIMARY KEY (`id`),
  UNIQUE KEY `uuid_idx` (`uuid`),
) ENGINE=InnoDB AUTO_INCREMENT=2343994 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci


CREATE TABLE `table2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uuid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '项目uuid',
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=5408 DEFAULT CHARSET=utf8mb4

从表结构发现,字符集以及字符编码不一致?那么应该如何转换呢
explain extended看下是否有提示:

select `id` AS `id`,
        xxxxxxxx 
       ``.`b`.`updated_at` AS `updated_at`
  from table2 `a` join `table1` `b`
 where((`a`.`project_create_at`<> '0000-00-00 00:00:00')
   and(`a`.`uuid`= convert(`b`.`uuid` using utf8mb4)))

从执行计划中显示还是,全表扫描那么使用explain extended show warnings 查看 and(swift_nuochou_com.a.uuid= convert(swift_nuochou_com.b.uuid using utf8mb4)))  进行了类型转换

那我们我们使用convert是否可行:

explain extended
select b.*
from (select convert(uuid using utf8) COLLATE utf8_unicode_ci as uuid
from table2 where project_create_at != "0000-00-00 00:00:00") a, table1 b
where a.uuid = b.uuid
+--------------+-----------------------+--------------------+----------------+-------------------------+-----------------------+-------------------+---------------+----------------+--------------------+-----------------------+
| id           | select_type           | table              | type           | possible_keys           | key                   | key_len           | ref           | rows           | filtered           | Extra                 |
+--------------+-----------------------+--------------------+----------------+-------------------------+-----------------------+-------------------+---------------+----------------+--------------------+-----------------------+
| 1            | PRIMARY               | <derived2>         | ALL            |                         |                       |                   |               | 117            |                100 |                       |
| 1            | PRIMARY               | b                  | eq_ref         | uuid_idx                | uuid_idx              | 386               | a.uuid        | 1              |                100 |                       |
| 2            | DERIVED               | table2             | range          | idx-project-create-at   | idx-project-create-at | 6                 |               | 117            |                100 | Using index condition |
+--------------+-----------------------+--------------------+----------------+-------------------------+-----------------------+-------------------+---------------+----------------+--------------------+-----------------------+
共返回 3 行记录,花费 3 ms.

注意这里面字符集以及字符编码都不一致,如果只改字符集的话,还是会全表扫描,需要先转字符集然后字符编码才可以

目录
相关文章
|
2月前
|
SQL 存储 数据库
sql事务、视图和索引
sql事务、视图和索引
14 0
|
2月前
|
SQL 存储 弹性计算
GaussDB SQL调优:建立合适的索引
GaussDB SQL调优:建立合适的索引
12 0
|
3月前
|
SQL 索引
SQL索引小结
SQL索引小结
18 0
|
2月前
|
存储 关系型数据库 MySQL
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
194 0
|
20天前
|
SQL 数据库 数据库管理
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
55 11
|
12天前
|
SQL 自然语言处理 数据库
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
|
20天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
22天前
|
SQL 数据库 索引
SQL索引失效原因分析与解决方案
SQL索引失效原因分析与解决方案
24 0
|
2月前
|
SQL
sql server案例总结
sql server案例总结
11 0