1

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

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

-- 预期结果是 <10 行。

-- 我们使用的是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 算法有关吗?

查询:~~~~~~

SELECT ftc.display_name , fl.* FROM lpb lb INNER JOIN 更精细 fl ON fl.reference = CAST(lb.id AS CHAR) LEFT JOIN fintran ftc ON fl.transactioncode_id = ftc.id WHERE 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 | 使用索引条件 |

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

4

1 回答 1

1

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

character_set_client character_set_connection

桌子是latin1的。但是,终端客户端没有使用 j 连接器,它为上述 2 个变量保留 latin1。

我们是怎么解决的?

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

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

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

于 2014-08-15T23:42:03.997 回答