mysql or会用到索引吗_mysql or条件可以使用索引而避免全表
在某些情况下,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条件可以使用索引而避免全表相关推荐
- mysql or全表_mysql or条件可以使用索引而避免全表
在某些情况下,or条件可以避免全表扫描的. 1 .where 语句里面如果带有or条件, myisam表能用到索引, innodb不行. 1)myisam表: CREATE TABLE IF NOT ...
- mysql 数据索引使用_mysql数据库正确建立索引及使用
普通mysql运行,数据量和访问量不大的话,是足够快的,但是当数据量和访问量剧增的时候,那么就会明显发现MySQL很慢,甚至down掉,那么就要考虑优化我们的mysql了.其中优化mysql的一个重要 ...
- mysql防止索引崩溃_MySQL优化之避免索引失效的方法
在上一篇文章中,通过分析执行计划的字段说明,大体说了一下索引优化过程中的一些注意点,那么如何才能避免索引失效呢?本篇文章将来讨论这个问题. 避免索引失效的常见方法 1.对于复合索引的使用,应按照索引建 ...
- mysql中groupby会用到索引吗_mysql order by 与索引的使用
测试数据表 user_group 表结构: id int(10) primarey key auto_increment user_id int(10) (唯一) group_id mediumint ...
- mysql 字符串索引 优化_MySQL性能优化之索引调优实战
索引失效场景或使用注意事项 a.索引无法存储null值,所以建议都给默认值 b.如果条件中有or,即使使用了索引条件也不起作用,所以尽量少用or 如果想使用or,又让索引生效,只能将or的每个列上加上 ...
- mysql 排序字段索引吗_Mysql 排序优化与索引使用(转)
为了优化SQL语句的排序性能,最好的情况是避免排序,合理利用索引是一个不错的方法.因为索引本身也是有序的,如果在需要排序的字段上面建立了合适的索引,那么就可以跳过排序的过程,提高SQL的查询速度.下面 ...
- mysql存储引擎 索引优化_MySQL存储引擎,索引及基本优化策略
存储引擎 与Oracle, SQL Server这些数据库不同,MySQL提供了多种存储引擎.什么是存储引擎?存储引擎其实就是一套对于数据如何存储,查询,更新,建立索引等接口的实现.不同存储引擎特性有 ...
- mysql s索引 树_mysql 学习 - B+树索引
我们已经知道在单一数据页中查找数据时, 如果查找条件是主键的话, 可以使用二分法定位槽, 然后顺序遍历槽中的数据查找指定数据. 但是我们并不知道如何在数以万计的页中定位数据在哪个页中, 在没有索引的情 ...
- mysql 创建索引失败_mysql创建多列索引及优化 - 没有所谓的失败!除非你不再尝试! - PHPChina ......
什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面 ...
最新文章
- 博创提供专业的解决方案---宝钢高炉改造无线监控
- 探究php底层运行机制
- Javascript重温OOP之原型与原型链
- javafx简单吗_JavaFX即将推出您附近的Android或iOS设备吗?
- 为什么envi镶嵌老是出错_10个数学考试老出错的根源和解决办法,你值得拥有
- Netty工作笔记0008---NIO的Buffer的机制及子类
- 那些年,我玩过的操作系统
- python编程(基于twisted的client编程)
- 数学建模之主成分分析
- 沃尔玛跨境智星的介绍与用法
- Unhandled kernel unaligned access问题记录
- html:简易制作拼多多登录页面
- rsync命令以及xsync封装
- 欧拉回路/路径浅谈(七桥问题,两种算法)
- 计算机专业竞聘词150,计算机专业组长竞聘演讲稿范文
- 无线网络渗透-1: 802.11 AP扫描
- 实验室管理系统(LIMS)涵盖的三层结构及应用
- android busybox脚本,在BusyBox中创建和控制启动脚本
- Android中的多媒体开发(一)——使用SoundPool来播放音效
- 冷热温度正反向控制技术在换热器热疲劳试验中的应用
热门文章
- lua的面向对象编程,封装,继承,多态的实现
- 前端科普系列(2):Node.js 换个角度看世界,
- Spark的实战题目——寻找5亿次访问中,访问次数最多的人
- Request method 'GET' not supported解决方式
- linux安装mysql详细过程【easy】
- leetcode 139. Word Break | 139. 单词拆分(动态规划)
- leetcode 371. Sum of Two Integers | 371. 两整数之和(补码运算)
- MySQL事务及锁机制大揭秘 - 公开课笔记
- Linux下出现permission denied的解决办法
- 分布式系统原理 之2 基本副本协议