【问题标题】:MySql: using @variable in select statment takes hundreds times longerMySql:在 select 语句中使用 @variable 需要数百倍的时间
【发布时间】:2012-01-13 20:28:12
【问题描述】:

我试图了解我在等效代码中看到的巨大性能差异。或者至少我认为是等效的代码。

我有一张表,上面有大约 1000 万条记录。它包含一个字段,其索引定义为: USPatentNum char(8)

如果我使用 MySql 将变量设置为一个值,则需要超过 218 秒。使用字符串文字进行完全相同的查询只需不到 1/4 秒。

在下面的代码中,第一个 select 语句(使用 where USPatentNum = @pn;)需要永远,但第二个,使用文字值 (其中 USPatentNum = '5288812';)几乎是即时的

mysql> 选择@pn := '5288812'; +------------------+ | @pn := '5288812' | +------------------+ | 5288812 | +------------------+ 一组中的 1 行(0.00 秒) mysql> 从其中 USPatentNum = @pn 的专利中选择专利 ID、USPatentNum、grantDate; +------------+-------------+------------+ |专利号 |美国专利号 |授予日期 | +------------+-------------+------------+ | 306309 | 5288812 | 1994-02-22 | +------------+-------------+------------+ 一组 1 行(3 分 38.17 秒) mysql>选择@pn; +----------+ | @pn | +----------+ | 5288812 | +----------+ 一组中的 1 行(0.00 秒) mysql> 从 USPatentNum = '5288812' 的专利中选择专利 ID、USPatentNum、grantDate; +------------+-------------+------------+ |专利号 |美国专利号 |授予日期 | +------------+-------------+------------+ | 306309 | 5288812 | 1994-02-22 | +------------+-------------+------------+ 一组中的 1 行(0.21 秒)

两个问题:

为什么使用@pn 这么慢? 我可以更改 select 语句以使性能相同吗?

【问题讨论】:

  • 是的,原来的问题陈述说它被索引了。
  • 不要聪明,回答我问的一半。现在,再说一遍,数据类型?
  • 也在原始声明中。 USPatentNum char(8)
  • 我也遇到了同样的问题。 This answered it

标签: mysql performance select


【解决方案1】:

在设置其值之前将@pn 声明为 char(8)。

我怀疑它会像你现在那样是一个 varchar。如果是这样,性能损失是因为MySql无法将索引与您的变量匹配。

【讨论】:

  • 我用什么语法来做声明?
  • 将@pn 声明为 varchar(8); ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'declare 
    附近使用正确的语法
  • 对不起。我大脑中的 MsSql 模式(以及错误的数据类型)尝试:select @pn := CAST('5288812' AS CHAR(8))
  • 仍然没有喜悦。 (由于 SO,@ 和 pn 之间有额外的空间)
     mysql> select @ pn := CAST('5288812' AS CHAR(8)); | @ pn := CAST('5288812' AS CHAR(8)) | +------------------------------------------------+ | 5288812 |集合中的 1 行(0.03 秒) mysql> 从其中 USPatentNum = @ pn 限制 10 的专利中选择专利 ID、USPatentNum、grantDate; | 306309 | 5288812 | 1994-02-22 |集合中的 1 行(1 分 21.90 秒)mysql> 从 USPatentNum = '5288812' 限制 10 的专利中选择专利 ID、USPatentNum、grantDate; | 306309 | 5288812 | 1994-02-22 |一组中的 1 行(0.10 秒)
  • 无赖,那我就不知道了。
【解决方案2】:

使用常量还是@var 都没有关系。您会得到不同的结果,因为 MySQL 第二次从缓存中获取结果。如果您再次执行您的方案,但使用 const 和 @var 交换位置查询,您将获得相同的结果(但具有另一个值)。第一个会慢,第二个会快。

希望对你有帮助

【讨论】:

  • 对不起,我换了订单,没有变化。关于@var
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
相关资源
最近更新 更多