【发布时间】: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