MySQL中的非确定性函数(即rand)可能会让您感到惊讶

使用sysbench处理测试用例,我遇到了这个问题:

的MySQL> 选择 *  sbtest1 其中 ID = ROUND(RAND()* 100000);
+ ------ + -------- + --------------------------------- -------------------------------------------------- -------------------------------------- + ----------- -------------------------------------------------- +
| id | k | c | 垫|
+ ------ + -------- + --------------------------------- -------------------------------------------------- -------------------------------------- + ----------- -------------------------------------------------- +
|  179 | 499871 | 09833083632 - 34593445843 - 98203182724 - 77632394229 - 31240034691 - 22855093589 - 98577647071 - 95962909368 - 34814236148 - 76937610370 | 62233363025 - 41327474153 - 95482195752 - 11204169522 - 13131828192 |
| 1606 | 502031 | 81212399253 - 12831141664 - 41940957498 - 63947990218 - 16408477860 - 15124776228 - 42269003436 - 07293216458 - 45216889819 - 75452278174 | 25423822623 - 32136209218 - 60113604068 - 17409951653 - 00581045257 |
+ ------ + -------- + --------------------------------- -------------------------------------------------- -------------------------------------- + ----------- -------------------------------------------------- +
2 0.30秒)

我真的很惊讶。首先,最重要的是,id是主键,rand()函数应该只生成一个值。怎么回来两行?其次,为什么响应时间为0.30秒?对于主键访问而言,这似乎非常高。

进一步观察:

CREATE  TABLE  `sbtest1`
  `id`  int11NOT  NULL  AUTO_INCREMENT
  `k`  INT11NOT  NULL  DEFAULT  '0' 
  `c`  char120NOT  NULL  DEFAULT  ''
  `pad`  char60NOT  NULL  DEFAULT  ''
  PRIMARY  KEY`id`),
  KEY  `k_1``k`
ENGINE = InnoDB  AUTO_INCREMENT = 1000001  DEFAULT  CHARSET = latin1
的MySQL> 解释 选择 *  sbtest1 其中 ID = ROUND(RAND()* 100000);
+ ---- + ------------- + --------- + ------------ + ------ + --------------- + ------ + --------- + ------ + -------- +  - --------- ------------- + +
| id | select_type |     | 分区 | 类型| possible_keys | 关键   | key_len | ref | 行| 过滤| 额外的|
+ ---- + ------------- + --------- + ------------ + ------ + --------------- + ------ + --------- + ------ + -------- +  - --------- ------------- + +
|  1 | 简单| sbtest1 | NULL        | 所有   | NULL           | NULL | NULL     | NULL | 986400 |    10.00 | 使用 何处 |
+ ---- + ------------- + --------- + ------------ + ------ + --------------- + ------ + --------- + ------ + -------- +  - --------- ------------- + +

所以它是一个主键,但MySQL不使用索引,它返回两行。这是一个错误吗?

确定性与非确定性功能

原来它根本不是一个bug。这是MySQL非常合乎逻辑的行为,但它不是我们所期望的。首先,为什么全表扫描?好吧,rand()是非确定性函数。这意味着我们不知道它将提前返回什么,实际上,这正是rand()的目的 - 返回一个随机值。在这种情况下,每次评估每行的函数并比

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值