Heim > Datenbank > MySQL-Tutorial > mysql or条件可以使用索引而避免全表扫描_MySQL

mysql or条件可以使用索引而避免全表扫描_MySQL

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-06-01 13:43:52
Original
1293 Leute haben es durchsucht

bitsCN.com

 

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

 

全表扫描了。

 

摘自 hguisu的专栏

bitsCN.com
Verwandte Etiketten:
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage