操作前先关闭数据库缓存

#创建测试的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. js对象及初识面向对象(4)

    一.什么是对象? 对象是包含了属性和方法的集合体 二.什么是面向对象? 面向对象是一种编程思想,在JS当中利用原型来阐述这种思想的编程方法 三.构建对象: 1.内置对象: String   Math  ...

  2. zabbix监控部署

    zabbix是一款开源的监控软件,下面来一起学习一下zabbix监控的部署吧 环境: 主机名 地址 系统 角色 tiandong 192.168.209.3 centos6.5 服务端 winter ...

  3. Inter IPP+ VS + opencv 在 Windows下的环境搭建

    首先Inter官网申请和下载:https://software.intel.com/en-us/intel-ipp 需要VS2013或更高版本(先装vs再装IPP,我的版本是VS2015社区版,IPP ...

  4. easyui datagrid的API

    本文可以当做api来使用 动态编辑用到DOM解析的话参考 http://www.w3school.com.cn/xmldom/dom_htmlcollection.asp 使用方法(Usage Exa ...

  5. Java 全栈知识体系 - 个人博客

    摘自:https://www.pdai.tech/ 著作权归https://www.pdai.tech所有. 链接:https://www.pdai.tech/ Java 全栈知识体系 包含: Jav ...

  6. ILSpy C# language support status

    C# language support status Asynchronous methods 已经支持 Generalized async return types  还不支持 Async main ...

  7. vue问题六:表单验证

    表单验证规则 查看文档:https://blog.csdn.net/weixin_42018790/article/details/80762149 1). el-form增加 :rules=&quo ...

  8. Windows10 修改键位映射

    https://blog.csdn.net/lhdalhd1996/article/details/90741092 1.为什么要修改键位我的笔记本键盘上下键是这样的: 很想捶死产品经理,你是从来不用 ...

  9. SAP Query创建

    一.SAP Query创建步骤 1.创建User Group User Group即用户组,可以将所创建的列表使用权限分配给具体用户,Tcode:SQ03 在使用者群組初始界面里输入自定义名称,单击[ ...

  10. EL表达式与JSTL标签库(一)

    1.JSTL概述 JSTL标签库由标签库和EL表达式两个部分组成.JSTL标准标签库(Java Server Page Standard Tag Library),用来解决创建的页面的操作问题,包括输 ...