案例: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.

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

目录
相关文章
|
1月前
|
SQL 数据库 开发者
MSSQL性能调优实战技巧:索引优化、SQL语句微调与并发控制策略
在Microsoft SQL Server(MSSQL)的管理与优化中,性能调优是一项复杂但至关重要的任务
|
1月前
|
SQL 监控 数据库
MSSQL性能调优实战策略:索引优化、SQL语句重构与并发控制
在Microsoft SQL Server(MSSQL)的管理和优化过程中,性能调优是确保数据库高效运行、满足业务需求的重要环节
|
1月前
|
SQL 运维 监控
MSSQL性能调优实战:索引优化、SQL查询效率提升与并发控制策略
在Microsoft SQL Server(MSSQL)的日常运维与性能优化中,精准的策略与技巧是实现高效数据库管理的关键
|
1月前
|
SQL 数据库 开发者
MSSQL性能调优实战:索引策略、SQL优化与并发管理深度剖析
在Microsoft SQL Server(MSSQL)的性能调优过程中,索引策略、SQL查询优化以及并发管理是关键的三大支柱
|
1月前
|
SQL 监控 数据库
MSSQL性能调优实战技巧:索引优化策略、SQL查询重构与并发控制详解
在Microsoft SQL Server(MSSQL)的管理与优化过程中,性能调优是确保数据库高效运行的关键环节
|
1月前
|
SQL 运维 监控
MSSQL性能调优实战:索引深度优化、SQL查询技巧与高效并发控制
在Microsoft SQL Server(MSSQL)的运维环境中,性能调优是确保数据库高效、稳定运行的核心任务
|
1月前
|
SQL 监控 数据库
MSSQL性能调优实战指南:精准索引策略、SQL查询优化与高效并发控制
在Microsoft SQL Server(MSSQL)的性能调优过程中,精准索引策略、SQL查询优化以及高效并发控制是三大核心要素
|
24天前
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之相同的SQL语句在不同时间执行EXPLAIN计划显示出不同的索引类型,是什么原因
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
PolarDB产品使用问题之相同的SQL语句在不同时间执行EXPLAIN计划显示出不同的索引类型,是什么原因
|
26天前
|
存储 SQL 索引
面试题MySQL问题之使用SQL语句创建一个索引如何解决
面试题MySQL问题之使用SQL语句创建一个索引如何解决
31 1
|
1月前
|
SQL 运维 监控
MSSQL性能调优实战技巧:索引优化、SQL查询优化与并发控制策略
在Microsoft SQL Server(MSSQL)的运维过程中,性能调优是确保数据库高效运行、满足业务需求的关键环节