在某些情况下,or条件可以避免全表扫描的。

1 .where 语句里面如果带有or条件, myisam表能用到索引, innodb不行。

1)myisam表:

CREATE TABLE IF NOT EXISTS `a` (

`id` int(1) NOT NULL AUTO_INCREMENT,

`uid` int(11) NOT NULL,

`aNum` char(20) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `uid` (`uid`)

) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

mysql> explain select * from a where id=1 or uid =2;

+----+-------------+-------+-------------+---------------+-------------+---------+------+------+---------------------------------------+

| id | select_type | table | type        | possible_keys | key         | key_len | ref  | rows | Extra                                 |

+----+-------------+-------+-------------+---------------+-------------+---------+------+------+---------------------------------------+

|  1 | SIMPLE      | a     | index_merge | PRIMARY,uid   | PRIMARY,uid | 4,4     | NULL |    2 | Using union(PRIMARY,uid); Using where |

+----+-------------+-------+-------------+---------------+-------------+---------+------+------+---------------------------------------+

1 row in set (0.00 sec)

2)innodb表:

CREATE TABLE IF NOT EXISTS `a` (

`id` int(1) NOT NULL AUTO_INCREMENT,

`uid` int(11) NOT NULL,

`aNum` char(20) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `uid` (`uid`)

) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

2 .必须所有的or条件都必须是独立索引:

+-------+----------------------------------------------------------------------------------------------------------------------

| Table | Create Table

+-------+----------------------------------------------------------------------------------------------------------------------

| a     | CREATE TABLE `a` (

`id` int(1) NOT NULL AUTO_INCREMENT,

`uid` int(11) NOT NULL,

`aNum` char(20) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 |

+-------+----------------------------------------------------------------------------------------------------------------------

1 row in set (0.00 sec)

explain查看:

mysql> explain select * from a where id=1 or uid =2;

+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |

+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

|  1 | SIMPLE      | a     | ALL  | PRIMARY       | NULL | NULL    | NULL |    5 | Using where |

+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

1 row in set (0.00 sec)

全表扫描了。

3. 用UNION替换OR (适用于索引列)

通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描.

注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低.

在下面的例子中, LOC_ID 和REGION上都建有索引.

高效:

select loc_id , loc_desc , region from location where loc_id = 10

union

select loc_id , loc_desc , region  from location where region = "melbourne"

低效:

select loc_id , loc desc , region from location where loc_id = 10 or region = "melbourne"

如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.

4. 用in来替换or

这是一条简单易记的规则,但是实际的执行效果还须检验,在oracle8i下,两者的执行路径似乎是相同的. 低效: select…. from location where loc_id = 10 or loc_id = 20 or loc_id = 30 高效 select… from location where loc_in  in (10,20,30);

mysql>  explain select * from a where id=1 or uid =2;

+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |

+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

|  1 | SIMPLE      | a     | ALL  | PRIMARY,uid   | NULL | NULL    | NULL |    5 | Using where |

+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

1 row in set (0.00 sec)

mysql索引or_mysql索引之or条件相关推荐

  1. mysql 组合索引 or_mysql索引优化实例(单列索引与组合索引)

    索引一般用于在数据规模大时对查询进行优化的一种机制,对于一般的查询来说,mysql会去遍历整个表,来查询符合要求的结果: 如果借助于mysql索引,mysql会将要索引的字段按照一定的算法进行处理,并 ...

  2. mysql 非等值条件 索引_mysql 索引学习--多条件等值查询,顺序不同也能应用联合索引啦...

    以前学习这一块的时候,是说:假设建立了联合索引a+b,那么查询语句也一定要是这个顺序才能应用该索引. 那么实际是怎样呢,经过mysql这么多次版本升级,相信mysql已经给我们做了某些优化. 下面是我 ...

  3. 尽量使用覆盖索引,避免select * || 用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到|| 如果MySQL评估使用索引比全表更慢,则不使用索引

    尽量使用覆盖索引,避免select * 尽量使用覆盖索引(只访问索引的查询(索引列完全包含查询列)),减少select * 7). 用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索 ...

  4. Mysql 如果有多个可选条件怎么加索引_MySQL|mysql-索引

    1.索引是什么 1.1索引简介 索引是表的目录,是数据库中专门用于帮助用户快速查询数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,以及快速定位查询数据.对于索引 ...

  5. MySQL实验: 实践索引对全列匹配、最左前缀匹配、范围查询等条件的影响以及了解脏读、幻读等...

    索引实验 实验目的:了解索引对于全列匹配,最左前缀匹配.范围查询的影响.实验所用数据库见文章最底部连接. 实验软件版本:5.7.19-0ubuntu0.16.04.1-log (Ubuntu) 实验存 ...

  6. 【MySQL】索引原理(三):联合索引(最左前缀原则),覆盖索引,索引条件下推

    准备工作,下面的演示都是基于user_innodb表: DROP TABLE IF EXISTS `user_innodb`; CREATE TABLE `user_innodb` (`id` big ...

  7. 数据库MySQL/mariadb知识点——索引

    索引 ​ 索引是特殊数据结构:定义在查找时作为查找条件的字段,索引实现在存储引擎. 索引可以降低服务需要扫描的数据量,减少了IO次数 索引可以帮助服务器避免排序和使用临时表 索引可以帮助将随机I/O转 ...

  8. php普通索引和唯一索引,mysql下普通索引和唯一索引的效率对比

    昨天有位同事说,他的网页查询过程中发现普通索引和唯一索引的效率是有差别的,普通索引比唯一索引快 今天在我的虚拟机中布置了环境,测试抓图如下: 抓的这几个都是第一次执行的,刷了几次后,取平均值,效率大致 ...

  9. mysql建索引java_MySQL 索引

    MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索 ...

最新文章

  1. 苹果手机怎么投屏 如何操作
  2. OC动态创建的问题变量数组.有数组,在阵列13要素,第一个数据包阵列,每3元素为一组,分成若干组,这些数据包的统一管理。最后,一个数组.(要动态地创建一个数组).两种方法...
  3. TCP报文格式和三次握手——三次握手三个tcp包(header+data),此外,TCP 报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。...
  4. 前端经典案例——购物车,Jquery实现
  5. 从SQL Server到多数据库,微软数据库迁移全攻略
  6. 谷歌浏览器一进百度空间就崩溃的临时解决方法
  7. keras实现DeepDream
  8. Java自定义拦截器详细教程
  9. 机械动力学瑞利法matlab程序,工业机器人的动力学建模与仿真+MATLAB程序
  10. 一批信息查询网站汇总
  11. AUC与ROC曲线面积的意义(细扒sklearn的AUC计算方法)
  12. C#里的InputBox
  13. mybatis case when
  14. 把服务器当网盘玩 教你从云服务器下载自己的文件
  15. 在堆区开辟内存(动态内存的开辟)
  16. 图解Oracle数据库(二)
  17. Leslie--Chueng项目服务端、小程序的本地部署操作教程
  18. 软件工程毕业论文mysql英文翻译_软件工程技术英文文献和中文翻译
  19. CUDA以及NVCC编译流程
  20. pdfminer __init__() got an unexpected keyword argument ‘codec‘解决方案

热门文章

  1. 使用transforms.Normalize((0.5,), (0.5,))异常报错“Process finished with exit code -1073741676 (0xC0000094)”
  2. MATLAB编程思想
  3. arm-none-linux-gnueabi交叉工具链 no such file or directory
  4. java程序员必备基础知识
  5. 实体(Entity)和模型(Model)
  6. 【剑指offer】数组中的逆序对
  7. 对AUTOCAD软件的一些配置
  8. JS 对象转化为数组
  9. Linux 环境下 Git 安装与基本配置
  10. T-SQL的进阶:超越基本级别3:构建相关子查询——701小组