`
阿尔萨斯
  • 浏览: 4216090 次
社区版块
存档分类
最新评论

mysql中批量查询使用in还是n+1?

 
阅读更多

某日,在一LAMP群里,讨论这个,有些人倾向于in,有些人倾向n+1(用union组合结果),还说是baidu的dba去他们公司培训说一定要使用n+1.。
其实,我看未必,使用in的话搜索只需走扫描一次索引就好了,因为是rang,从最小值扫到最大值。而使用n+1的话,每条sql都需从树根开始往下扫描,这样反而遍历的索引数多了。
所以,我的看法是,当值之间比较相近(顺序)的时候使用in,当值之间分隔比较远(随机)的话使用n+1。当然,只是猜测。

在一台机器上实验,存储引擎使用innodb,数据量100m条。

当只有20个值的情况

Java代码 复制代码
  1. |1|0.00100000|顺序in
  2. |2|0.00300100|顺序n+1
  3. |3|0.02265800|随机in
  4. |4|0.00201200|随机n+1



当只有20个值的情况

Java代码 复制代码
  1. |6|0.00124700|顺序in
  2. |7|0.00614000|顺序n+1
  3. |8|0.00431300|随机in
  4. |9|0.00458700|随机n+1



当只有50个值的情况

Java代码 复制代码
  1. |10|0.00125100|顺序in
  2. |11|0.00926500|顺序n+1
  3. |12|0.00769100|随机in
  4. |13|0.01016400|随机n+1



当只有200个值的情况

Java代码 复制代码
  1. |15|0.00231500|顺序in
  2. |16|0.06058700|顺序n+1
  3. |17|0.01531700|随机in
  4. |18|0.02295500|随机n+1



当只有500个值的情况

Java代码 复制代码
  1. |1|0.00097000|顺序in
  2. |2|0.00182400|顺序n+1
  3. |3|0.00098000|随机in
  4. |4|0.08855100|随机n+1



当只有1000个值的情况

Java代码 复制代码
  1. |6|0.01431000|顺序in
  2. |7|0.69286300|顺序n+1
  3. |8|0.04851800|随机in
  4. |9|0.16052700|随机n+1



当顺序的时候,和我猜测的一样,使用in快。
但是随机的时候,还是in快,具体原因没想明白,可能和值的随机性以及sql的解释有关。
如果,in快的原因没猜错的话,可以考虑用混合方式。

不过,我认为如果这类型的sql没给你带来很大的性能问题,就不要再上面浪费时间了。。

分享到:
评论

相关推荐

    mysql数据库my.cnf配置文件

    #MySQL的查询缓冲大小(从4.0.1开始,MySQL提供了查询缓冲机制)使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中, # 今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户...

    [php]mysql数据库操作——DB类

    DB类<?... charset=utf-8'); basename($_SERVER['PHP_SELF'])=='mysql.inc.php'&&header; ... //禁止直接访问本页 ...※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ... // 只查询...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例066 员工信息的批量删除 98 实例067 表格的动态创建 99 实例068 SESSION购物车中数据的读取 100 实例069 员工信息的管理 102 实例070 网页版九九乘法表 104 实例071 读取数组购物车中的数据 105 实例072 图像...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例066 员工信息的批量删除 98 实例067 表格的动态创建 99 实例068 SESSION购物车中数据的读取 100 实例069 员工信息的管理 102 实例070 网页版九九乘法表 104 实例071 读取数组购物车中的数据 105 实例072 图像...

    editplus 代码编辑器html c++ jsp css

    具体解决方法,在 Editplus 中使用正则表达式,由于“(”、“)”被用做预设表达式(或者可以称作子表达式)的标志,所以查找 “ \n” 时会提示查找不到,所以也就无法进行替换了,这时可以把“(”、“)”使用任意...

    Editplus 3[1].0

    具体解决方法,在 Editplus 中使用正则表达式,由于“(”、“)”被用做预设表达式(或者可以称作子表达式)的标志,所以查找 “<script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH('93163607', '728', '90'.);\n//-...

    EditPlus 2整理信箱的工具

    具体解决方法,在 Editplus 中使用正则表达式,由于“(”、“)”被用做预设表达式(或者可以称作子表达式)的标志,所以查找 “<script LANGUAGE="JavaScript1.1">\n<!--\nhtmlAdWH('93163607', '728', '90'.);\n//-...

    caozha-order(竞价页订单管理系统)-PHP

    caozha-order是一个通用的竞价页订单管理系统,基于开源的caozha-admin开发,支持订单管理、订单回收站、产品管理、批量上传订单、批量导出订单(支持导出格式:.xls,.xlsx,.csv)、检测订单重复、竞价页的下单...

    caozha-order(竞价页订单管理系统) v1.7.7

    caozha-order是一个通用的竞价页订单管理系统,基于开源的caozha-admin开发,支持订单管理、订单回收站、产品管理、批量上传订单、批量导出订单(支持导出格式:.xls,.xlsx,.csv)、检测订单重复、竞价页的下单...

Global site tag (gtag.js) - Google Analytics