操作前先关闭数据库缓存

#创建测试的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. AcWing:175. 电路维修(bfs)

    达达是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女翰翰,从而被收留在地球上. 翰翰的家里有一辆飞行车. 有一天飞行车的电路板突然出现了故障,导致无法启动. 电路板的整体结构是一个R ...

  2. QT的UDP组播技术

    一 UDP介绍 UDP是一种简单轻量级的传输层协议,提供无连接的,不可靠的报文传输.适合下面4种情况: 网络数据大多为短消息. 拥有大量客户端. 对数据安全性无特殊要求 网络负担非常重,但对响应速度要 ...

  3. Android 获取Bitmap方式

    1.获得当前项目资源文件(assets)下图片 (1).获得图片数据流 private Bitmap getBotMapInfo() { Bitmap bitmap = null; try { Inp ...

  4. append和push和pop区别

    append()    操作的是DOM节点,在被选元素的结尾(内部结尾)插入指定内容: push()        向数组末尾插入一个或者多个元素,并且返回新的长度: pop()         删除 ...

  5. javascript循环语句

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. mongod 对指定数据库创建用户

    https://blog.51cto.com/wzlinux/2153062?source=dra 1.先在admin库中创建管理员用户与密码 [root@mbasic ~]# mongo Mongo ...

  7. Linux 查看操作系统版本信息 uname

    Linux 查看操作系统版本信息 uname uname 命令用于显示当前系统的版本信息. 带 -a 选项的 uname 命令会给出当前操作系统的所有有用信息. 命令如下: [root@node1 / ...

  8. java源码-CountDownLatch源码分析

    这次分析CountDownLatch,相信大部分人都用过把! CountDownLatch内部还是Sync对象,还是基础AQS(可见其重要性),首先看一下CountDownLatch初始化,Count ...

  9. centos7安装VuePress

    VuePress可以帮你快速建站,使用MarkDown语法生成静态html yum install -y gcc-c++ make curl -sL https://rpm.nodesource.co ...

  10. 利用Bag中的getCount()方法统计list集合中重复元素

    实际应用场景:从Excel导入数据时,存在某个标识符相同的多条数据,需要进行合并,因此需要统计重复元素,可以利用Bag包下的getCount()进行统计,代码如下: package test.com. ...