在某些情况下,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 ;

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)

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 or会用到索引吗_mysql or条件可以使用索引而避免全表相关推荐

  1. mysql or全表_mysql or条件可以使用索引而避免全表

    在某些情况下,or条件可以避免全表扫描的. 1 .where 语句里面如果带有or条件, myisam表能用到索引, innodb不行. 1)myisam表: CREATE TABLE IF NOT ...

  2. mysql 数据索引使用_mysql数据库正确建立索引及使用

    普通mysql运行,数据量和访问量不大的话,是足够快的,但是当数据量和访问量剧增的时候,那么就会明显发现MySQL很慢,甚至down掉,那么就要考虑优化我们的mysql了.其中优化mysql的一个重要 ...

  3. mysql防止索引崩溃_MySQL优化之避免索引失效的方法

    在上一篇文章中,通过分析执行计划的字段说明,大体说了一下索引优化过程中的一些注意点,那么如何才能避免索引失效呢?本篇文章将来讨论这个问题. 避免索引失效的常见方法 1.对于复合索引的使用,应按照索引建 ...

  4. mysql中groupby会用到索引吗_mysql order by 与索引的使用

    测试数据表 user_group 表结构: id int(10) primarey key auto_increment user_id int(10) (唯一) group_id mediumint ...

  5. mysql 字符串索引 优化_MySQL性能优化之索引调优实战

    索引失效场景或使用注意事项 a.索引无法存储null值,所以建议都给默认值 b.如果条件中有or,即使使用了索引条件也不起作用,所以尽量少用or 如果想使用or,又让索引生效,只能将or的每个列上加上 ...

  6. mysql 排序字段索引吗_Mysql 排序优化与索引使用(转)

    为了优化SQL语句的排序性能,最好的情况是避免排序,合理利用索引是一个不错的方法.因为索引本身也是有序的,如果在需要排序的字段上面建立了合适的索引,那么就可以跳过排序的过程,提高SQL的查询速度.下面 ...

  7. mysql存储引擎 索引优化_MySQL存储引擎,索引及基本优化策略

    存储引擎 与Oracle, SQL Server这些数据库不同,MySQL提供了多种存储引擎.什么是存储引擎?存储引擎其实就是一套对于数据如何存储,查询,更新,建立索引等接口的实现.不同存储引擎特性有 ...

  8. mysql s索引 树_mysql 学习 - B+树索引

    我们已经知道在单一数据页中查找数据时, 如果查找条件是主键的话, 可以使用二分法定位槽, 然后顺序遍历槽中的数据查找指定数据. 但是我们并不知道如何在数以万计的页中定位数据在哪个页中, 在没有索引的情 ...

  9. mysql 创建索引失败_mysql创建多列索引及优化 - 没有所谓的失败!除非你不再尝试! - PHPChina ......

    什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面 ...

最新文章

  1. 博创提供专业的解决方案---宝钢高炉改造无线监控
  2. 探究php底层运行机制
  3. Javascript重温OOP之原型与原型链
  4. javafx简单吗_JavaFX即将推出您附近的Android或iOS设备吗?
  5. 为什么envi镶嵌老是出错_10个数学考试老出错的根源和解决办法,你值得拥有
  6. Netty工作笔记0008---NIO的Buffer的机制及子类
  7. 那些年,我玩过的操作系统
  8. python编程(基于twisted的client编程)
  9. 数学建模之主成分分析
  10. 沃尔玛跨境智星的介绍与用法
  11. Unhandled kernel unaligned access问题记录
  12. html:简易制作拼多多登录页面
  13. rsync命令以及xsync封装
  14. 欧拉回路/路径浅谈(七桥问题,两种算法)
  15. 计算机专业竞聘词150,计算机专业组长竞聘演讲稿范文
  16. 无线网络渗透-1: 802.11 AP扫描
  17. 实验室管理系统(LIMS)涵盖的三层结构及应用
  18. android busybox脚本,在BusyBox中创建和控制启动脚本
  19. Android中的多媒体开发(一)——使用SoundPool来播放音效
  20. 冷热温度正反向控制技术在换热器热疲劳试验中的应用

热门文章

  1. lua的面向对象编程,封装,继承,多态的实现
  2. 前端科普系列(2):Node.js 换个角度看世界,
  3. Spark的实战题目——寻找5亿次访问中,访问次数最多的人
  4. Request method 'GET' not supported解决方式
  5. linux安装mysql详细过程【easy】
  6. leetcode 139. Word Break | 139. 单词拆分(动态规划)
  7. leetcode 371. Sum of Two Integers | 371. 两整数之和(补码运算)
  8. MySQL事务及锁机制大揭秘 - 公开课笔记
  9. Linux下出现permission denied的解决办法
  10. 分布式系统原理 之2 基本副本协议