【发布时间】:2016-08-07 02:01:33
【问题描述】:
我有一个奇怪的情况,从下表中按列pqth_scan_code 进行简单选择:
表 pqth_
Field Type Null Key Default Extra
pqth_id int(11) NO PRI NULL auto_increment
pqth_scan_code varchar(250) NO NULL
pqth_info text YES NULL
pqth_opk int(11) NO 999
查询 1
此查询执行耗时 12.7221 秒
SELECT * FROM `pqth_` WHERE pqth_scan_code = "7900722!30@3#6$EN"
查询 2 此查询执行耗时 0.0003 秒
SELECT * FROM `pqth` WHERE `pqth_id`=27597
基于表 pqth_ 中的数据,我创建了下表,其中 pqthc_id = pqth_id 和 pqthc_scan_code=pqth_scan_code
表 pqthc
Field Type Null Key Default Extra
pqthc_id int(11) NO PRI NULL
pqthc_scan_code tinytext NO NULL
在表pqthc 上执行相同的查询query1 耗时 0.0259 秒
SELECT * FROM `pqthc` WHERE pqthc_scan_code = "7900722!30@3#6$EN"
如果我运行下面的查询会花费 0.0971 秒,很奇怪。
查询 3
SELECT * FROM `pqth` WHERE pqth_id = (SELECT pqthc_id From pqthc where pqthc_scan_code = "7900722!30@3#6$EN")
我的问题是为什么 pqth_scan_code 的 SELECT 速度很慢,而 pqth_id 的 SELECT 速度最快?这两列都有索引。
如需测试,请从link 获取导出
MySQL 和 MariaDB 服务器的行为相同
【问题讨论】:
-
据我所知,与按数字搜索相比,在 MySQL 中基于文本的搜索要慢得多。我认为这就是问题所在。
-
您是否尝试过在 SQL 中针对所有相应的查询执行执行计划?这可能会给你答案。快速说明, pqthc_scn_code 无论如何都是 varchar 并且没有索引,它必须花费时间来获取数据。是的,引擎在内存中检索到的列数会影响 I/O 操作,从而影响最终时间。您将在执行计划中看到这一点。