下面的查询给出了 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 | 使用索引条件 |
+----+-------------+--------+--------+------------- ----------------+-----------------------------+--- ------+------------------+------+----- ------------------+