【问题标题】:Mysql 5.6 different execution plan for same query.(Java client vs terminal)Mysql 5.6 相同查询的不同执行计划。(Java客户端与终端)
【发布时间】:2014-10-06 05:17:36
【问题描述】:

以下查询在 GUI 客户端 (DB Viz) 与终端之间提供了 2 个不同的执行计划,并且当我们从 GUI/Java 应用程序调用时花费的时间太长。

-- 当我们从 mysql 终端(直接从 mysql 客户端在服务器上)执行查询时,查询在亚秒内运行。但是当我们从 Java 应用程序/GUI 客户端(如 DBVIz)调用此查询时,需要 55 秒。

-- 预期结果为

-- 我们使用的是 Mysql 5.6。本次查询涉及的所有表都是innodb。

-- 问题从 5.6 开始,我们使用的是 5.0,最近升级到 5.6。

-- 在这个查询中需要注意的是,这是在具有不同数据类型的列上连接 2 个表。

-- 我们在基于列“finer.refernce”连接的所有查询中都有类似的问题,该列是 varchar(255) 列,它是一个通用列,用于存储整数值并将与其他具有整数 ID 的表。

-- 我们在 finer.refernce 上有索引 idxf_reference。

-- 请注意,查询具有显式类型转换 CAST(lb.id AS CHAR)。也尝试了 CONVERT(lb.id,CHAR(255)) 并且结果相同。

-- GUI中使用的mysql驱动是mysql-connector-java-5.1.25。还尝试了 mysql-connector-java-5.1.31。并且有同样的问题。

-- GUI 上的分析显示查询在“发送数据”状态下花费了 52 秒。在终端中,“发送数据”是亚秒级

-- 执行计划的重要区别是,GUI计划不使用索引,而是使用“使用连接缓冲区(块嵌套循环)”。

-- 尝试了 FORCE INDEX,但仍然没有在 GUI/Java 应用程序上使用索引。

--这和BNL/BKA算法有关系吗?

查询: ~~~~~~

选择 ftc.display_name , 佛罗里达州* 从 磅磅 内部联接 更细的流线 在 fl.reference = CAST(lb.id AS CHAR) 左连接 金融贸易委员会 在 fl.transactioncode_id = ftc.id 在哪里 lb.ld_id = 12345;

该计划有 3 行,其中 2 行相同,不同之处在于“fl”表。计划摘录下方。

从 GUI 计划:

~~~~~~~~~~~~~~

id select_type table type possible_keys key key_len ref rows Extra


1 SIMPLE fl ALL (null) (null) (null) (null) 30100452 使用 where;使用连接缓冲区(块嵌套循环)

从终端计划:

~~~~~~~~~~~~~~~~~~~

+----+-------------+-------+--------+---------- -------------------+--------------------------------+ ------+---------------+------+-- ---------------------+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------+--------+------------- ----------------+-----------------------------+--- ------+------------------+------+----- ------------------+ | 1 |简单 |佛罗里达 |参考 | idxf_reference | idxf_reference | 258 |功能 | 1 |使用索引条件 |

+----+-------------+-------+--------+---------- -------------------+--------------------------------+ ------+---------------+------+-- ---------------------+

【问题讨论】:

    标签: indexing mysql-connector jointable sql-execution-plan mysql-5.6


    【解决方案1】:

    我找到了执行计划更改的原因,由于 varchar 列需要 utf8mb4 转换,服务器在从 GUI 客户端执行查询时未使用索引。之所以需要这种转换,是因为 java 应用程序和 GUI 客户端中使用的 j 连接器根据服务器配置 (http://dev.mysql.com/doc/relnotes/connector-j/en/news-5-1-13.html) 将以下 2 个变量设置为 utf8mb4。

    character_set_client 字符集连接

    并且表格是 latin1。但是,终端客户端没有使用 j 连接器,它为上述 2 个变量保留了 latin1。

    我们是如何解决的?

    J 连接器根据服务器配置决定上述值,因此我们从服务器 my.conf 中删除了以下 2,

    默认字符集 = utf8 字符集服务器 = utf8

    删除后,默认值设置为 latin1 并且问题解决了。如果有人遇到同样的问题,希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2021-03-15
      • 2014-07-28
      相关资源
      最近更新 更多