mysql优化or_mysqlor语句的优化
在某些情况下,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)
mysql语句转oracle) 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,
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条件都必须是独⽴索引:
dz插件+——-+———————————————————————————————————————-小程序开发参考文献
| Table | Create Table
+——-+———————————————————————————————————————-
| a | CREATE TABLE a (
id int(1) NOT NULL AUTO_INCREMENT,
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;
+—-+————-+——-+——+—————+——+———+——+——+————-+
php博客| 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)
全表扫描了。
⽤UNION替换OR (适⽤于索引列)
通常情况下,⽤UNION替换WHERE⼦句中的OR将会起到较好的效果. 对索引列使⽤OR将造成全表扫描.
注意,以上规则只针对多个索引列有效. 如果有column没有被索引,查询效率可能会因为你没有选择OR⽽降低.在下⾯的例⼦中,LOC_ID 和REGION上都建有索引.
⾼效:
[sql] view plain copy print?
select loc_id,loc_desc,region from location where loc_id = 10
union
select loc_id,region from location where region = “melbourne”
低效:
[sql] view plain copy print?
select loc_id,loc desc,region from location where loc_id = 10 or region = “melbourne”
如果你坚持要⽤OR,那就需要返回记录最少的索引列写在最前⾯.
⽤in来替换or
这是⼀条简单易记的规则,但是实际的执⾏效果还须检验,在oracle8i下,两者的执⾏路径似乎是相同的.低效:
access数据库自学教程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);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。