操作前先关闭数据库缓存

#创建测试的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. HDU 5793 A Boring Question ——(找规律,快速幂 + 求逆元)

    参考博客:http://www.cnblogs.com/Sunshine-tcf/p/5737627.html. 说实话,官方博客的推导公式看不懂...只能按照别人一样打表找规律了...但是打表以后其 ...

  2. Java微信服务号的开发(简单入门)

    进行微信服务号开发的步骤 一个别人已经搭建好的项目参考地址:下载链接 1.搭建微信服务号的服务器 项目配置maven <dependency> <groupId>com.soe ...

  3. 码云转移至阿里云Code记录

    用起来还是挺简单的,跟码云差不多,但关键是企业私有项目成员人数没有限制!码云限制5人(免费) 注意两点: 1.导入仓库链接的时候,如果username是邮箱含@,要换成%40,不然这个项目直接报500 ...

  4. MySort作业与IO-Myhead

    一.MySort 1.题目要求 模拟实现Linux下Sort -t : -k 2的功能. 要有伪代码,产品代码,测试代码(注意测试用例的设计) 参考 Sort的实现.提交博客链接. 2.产品代码 im ...

  5. DP&图论 DAY 6 下午 考试

    DP&图论  DAY 6  下午  考试 样例输入 样例输出 题解 >50 pt      dij 跑暴力 (Floyd太慢了QWQ    O(n^3)) 枚举每个点作为起点,dijks ...

  6. 过滤器demo-编码统一处理

    package com.loaderman.demo.a_loginFilter; import java.io.IOException; import java.lang.reflect.Invoc ...

  7. zabbix客户端监控

    1.安装zabbix客户端软件: yum install -y zabbix20-agent2.修改配置文件vim /etc/zabbix_agentd.conf修改如下: (1)更改Server,S ...

  8. 【转】Linux curl命令详解

    [From]https://www.cnblogs.com/duhuo/p/5695256.html 命令:curl 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一 ...

  9. java:svn

    1.配置: 在windows系统中,操作svn的工具最长用的是小乌龟svn 服务器端(项目所在的服务器上):在java开发中几乎所有的服务器为Linux系统 需要在Linux系统中进行安装 1.修改h ...

  10. 数据存储--SQLite

    SQLite是一个开源嵌入式关系数据库,实现自包容,零配置,单个文件就是数据库,方便存储和转移,在window不用安装,直接解压到文件夹,并设置path. Ubuntu下安装:sudo apt ins ...