操作前先关闭数据库缓存

#创建测试的test表

DROP TABLE IF EXISTS test;
CREATE TABLE test(
`id` INT(10) NOT NULL,
`name` VARCHAR(20) DEFAULT '' NOT NULL,
`status` TINYINT(1) DEFAULT 1 NOT NULL,
PRIMARY KEY( ID )
)ENGINE=INNODB DEFAULT CHARSET utf8;

插入数据

create procedure a()
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit = 0;
WHILE i<10000000 DO
INSERT INTO test ( `id`,`name`,`status` ) VALUES( i, CONCAT( 'abcd', i ),i%3 );
SET i = i+1;
IF i%2000 = 0 THEN // 每满2000行执行一次
COMMIT;
END IF;
END WHILE;
END;
call a();
耗时: 0.042s

先测试带主键模式下查询主键执行时间

读取10条数据
# in
SELECT * FROM test WHERE id IN (1,2,3,4,5,6,7,8,9,10);
用时:0.001 # or
SELECT * FROM test WHERE id =1 OR id=2 OR id=3 OR id=4 OR id=5 OR id=6 OR id=7 OR id=8 OR id=9 OR id=10;
用时:0.001 # between
SELECT * FROM test WHERE id between 1 and 10;
用时:0.001 # <>
SELECT * FROM test WHERE id>=1 and id<=10;
用时:0.001 # <=
SELECT * FROM test WHERE id <= 10;
用时:0.001
读取1000条数据
# in
SELECT * FROM test WHERE id IN (1,2,3,...1000);
用时:0.003 # or
SELECT * FROM test WHERE id =1 OR id=2 OR id=3 OR... id=1000;
用时:0.019 # between
SELECT * FROM test WHERE id between 1 and 100;
用时:0.002 # <>
SELECT * FROM test WHERE id>=1 and id<=1000;
用时:0.002 # <=
SELECT * FROM test WHERE id <= 1000;
用时:0.002
读取10000条数据
# in
SELECT * FROM test WHERE id IN (1,2,3,...10000);
用时:0.027
# or 
SELECT * FROM test WHERE id =1 OR id=2 OR id=3 OR... id=10000;
执行用时:4.834 # between
SELECT * FROM test WHERE id between 1 and 10000;
用时:0.008 # <>
SELECT * FROM test WHERE id>=1 and id<=10000;
用时:0.008 # <=
SELECT * FROM test WHERE id <= 10000;
用时:0.008
读取50000条数据(sql语句太长,10万数据 in和or会崩溃)
# in
SELECT * FROM test WHERE id IN (1,2,3,...50000);
用时:5.193s # or
SELECT * FROM test WHERE id =1 OR id=2 OR id=3 OR... id=50000;
用时:(sql语句太长,电脑崩溃) # between
SELECT * FROM test WHERE id between 1 and 50000;
用时:0.035s # <>
SELECT * FROM test WHERE id>=1 and id<=50000;
用时:0.032s # <=
SELECT * FROM test WHERE id <= 50000;
用时:0.031s

在主键id上 in的效率要高于or;其它几个比较符相近。

测试非主键 status

读取10000000条数据(一千万条数据)
# in
SELECT * FROM test WHERE status IN (0,1);
用时:6.736s # or
SELECT * FROM test WHERE status =0 OR status=1;
用时:6.655s # between
SELECT * FROM test WHERE status between 0 and 1;
用时:6.476s # <>
SELECT * FROM test WHERE status>=0 and status<=1;
用时:6.680s # <=
SELECT * FROM test WHERE status <= 1;
用时:6.440s
# <>
SELECT * FROM test WHERE status <> 2;
用时:6.263s
 

当id的主键索引去除后

读取10000000条数据(一千万条数据)
# in
SELECT * FROM test WHERE status IN (0,1);
用时:7.888s # or
SELECT * FROM test WHERE status =0 OR status=1;
用时:7.770s # between
SELECT * FROM test WHERE status between 0 and 1;
用时:7.989s # <= =>
SELECT * FROM test WHERE status>=0 and status<=1;
用时:7.835s # <=
SELECT * FROM test WHERE status <= 1;
用时:7.476s # <>
SELECT * FROM test WHERE status <> 2;
用时:8.346s

非主键字段有无主键索引差距不是很大。

强制走主键索引

select * from test force index(PRIMARY) where status in (0,1);
用时:10.930

数据库or、in、<>、>=、<=、butween区别的更多相关文章

  1. MySQL数据库引擎介绍、区别、创建和性能测试的深入分析

    本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下   数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...

  2. [转]MySQL数据库引擎介绍、区别、创建和性能测试的深入分析

    本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下   数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...

  3. sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系

    原创链接:https://www.cnblogs.com/lxf1117/p/6762315.html sql server登录名.服务器角色.数据库用户.数据库角色.架构区别联系 1.一个数据库用户 ...

  4. MySQL数据库各个版本的区别

    MySQL数据库各个版本的区别 MySQL数据库 MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管 ...

  5. 数据库与数据仓库的区别实际讲的是OLTP与OLAP的区别

    什么是数据仓库 数据仓库,英文名称为Data Warehouse,可简写为DW或DWH.数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合.它出于分析性报告和决策支持目的而创建. ...

  6. MySQL数据库引擎介绍、区别

    数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEAP.另 ...

  7. Oracle数据库各种名字的区别

    数据库名(DB_NAME).数据库实例名(INSTANCE_NAME).操作系统环境变量(ORACLE_SID).数据库服务名(SERVICE_NAME).数据库域名(DB_DOMAIN)以及全局数据 ...

  8. 数据库之“on”“where”区别

    数据库在通过连接两张或者多张表返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户 在使用inner join(内连接)没有区别,但是 在使用left jion时,on和where条件的 ...

  9. 非关系型数据库(NOSQL)和关系型数据库(SQL)区别详解

    前言: 在我们的日常开发中,关系型数据库和非关系型数据库的使用已经是一个成熟的软件产品开发过程中必不可却的存储数据的工具了.那么用了这么久的关系数据库和非关系型数据库你们都知道他们之间的区别了吗?下面 ...

随机推荐

  1. node链接mongoDB及封装

    // 这个模块中封装所有对数据库的常用操作 const MongoClient = require('mongodb').MongoClient; const assert = require('as ...

  2. 原生Js_简易图片轮播模板

    功能:图片自动循环轮播,通过点击“上一张”,“下一张”按钮来控制图片的切换 <!DOCTYPE html> <html> <head> <meta chars ...

  3. [CSP-S模拟测试]:慢无止境的八月(乱搞)

    题目传送门(内部题102) 输入格式 第一行三个正整数$n,k,q$,分别表示数列长度,操作长度和修改个数. 第二行$n$个数,表示给出的终止数列. 接下来$q$行,每行两个数$pos,dx$,表示将 ...

  4. BZOJ1718分离的路径

    边双题. 求的就是最少加几条边可以使一个图变成边双联通图. 首先tarjan求一下边双,缩完点变成一颗树,统计度数为1的点(无根树的叶子),把这个数算出来,设为x,则ans=(x+1)/2. 这个可以 ...

  5. 协程系列之Event Loops

    Event Loops 事件循环 事件是由程序的一部分在特定条件下发出的消息,循环是在某种条件下完成并执行某个程序直到它完成的构造,因此,事件循环是一个循环,它允许用户订阅事件传输并注册处理程序/回调 ...

  6. 在mac上如何用safari调试ios手机的移动端页面

    第一步:打开iphone手机的开发者模式,流程是:[设置]->[Safari]->[高级]->开启[Web检查器] ,如图1.图2 图1 图2第二步:打开Mac上Safari的开发者 ...

  7. Linux编程之文件锁

    1. 使用 fcntl() 给记录加锁 使用 fcntl() 能够在一个文件的任意部分上放置一把锁,这个文件部分既可以是一个字节,也可以是整个文件.这种形式的文件加锁通常被称为记录加锁,但这种称谓是不 ...

  8. Windows下Git的下载与安装

    1).打开百度,输入Git进行搜索,如下图所示: 2).进入Git官网,由于电脑是Windows系统,选择Downloads for Windows,如下图所示: 3).电脑是64位操作系统,选择下载 ...

  9. list元素按照日期排序

    private static void ListSort(List<AppClassInfoVo> list) { Collections.sort(list, new Comparato ...

  10. vue生命周期updated的触发时机之debug过程中发现的firefox问题

    现象描述: 断点位置1 谷歌debug的过程: 火狐debug的过程: 只要在改变数据之后有断点停顿,就会先去执行updated函数 断点位置2 此时火狐和谷歌是一样的效果,但是执行顺序是不一致的 谷 ...