zoukankan      html  css  js  c++  java
  • MySQL in or效率对比

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/60

    考虑如下两个sql:

    select * from table where id in (xxx,xxx,xxx...,xxx)
    
    select * from table where id=xxx or id=xxx or id=xxx ... or id=xxx
    

    哪个效率更高呢?
    首先应该明白的一点是mysql会对in的列表进行排序(升序),然后再进行查询。当id为主键时,两个sql效率差别不大,都运用了主键进行查询。但是当id上没有索引时,mysql会扫描整个表,对每一个元组的id去in的列表或者or的列表里进行查询,看是否在其列表当中。但是由于in的列表是有序的,mysql会运用二分查找,时间复杂度为O(logN),但是or的列表mysql进行逐一查找,时间复杂度为O(N)。所以在没有索引时,in的效率会高于or。

    在InnoDB引擎下,in返回的顺序是按照主键排序的,我以前一直以为是按照in列表里排序好的顺序进行排序的:

    mysql> show create table aG;
    *************************** 1. row ***************************
           Table: a
    Create Table: CREATE TABLE `a` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `data` int(10) unsigned NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    
    ERROR: 
    No query specified
    
    mysql> select * from a where data in(10,3,0,1,2,8,7,5);
    +----+------+
    | id | data |
    +----+------+
    |  1 |    1 |
    |  2 |    0 |
    |  3 |    3 |
    |  5 |    0 |
    |  6 |    3 |
    |  7 |    0 |
    |  8 |   10 |
    | 20 |   10 |
    +----+------+
    8 rows in set (0.00 sec)
    
  • 相关阅读:
    RabbitMQ学习笔记【1】
    【转】ES6学习笔记
    vue学习笔记【2】--模板语法
    vue学习笔记【1】
    npm使用
    Golang密码复杂度校验
    GORM的增删改查
    GORM:创建数据
    golang的time包:时间字符串和时间戳的相互转换
    输出10以内的所有正整数(while+if用法)
  • 原文地址:https://www.cnblogs.com/zhangyachen/p/8033221.html
Copyright © 2011-2022 走看看