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);

轉自:http://blog.csdn.net/hguisu/article/details/7106159

原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/3119

(0)
s19930811s19930811
上一篇 2015-04-13
下一篇 2015-04-13

相關推薦

  • 馬哥教育網絡20期—nginx

    Nginx 一. Nginx 特性 二. Nginx 基本架構 三. Nginx 基本功能 四. Nginx 安裝 五. Nginx 配置文件 六. Nginx http服務功能測試 七. Nginx LNMP 一. Nginx 特性 模塊化,目前只能將模塊編譯進Nginx,暫時不支持動態裝卸載模塊.(httpd優勢) 可靠性,一個主進程(master)控制…

    Linux干貨 2016-06-26
  • Linux文本處理工具之grep

    簡介     grep:Global search regular expression and print out the line.     grep是一種文本搜索處理工具,根據用戶指定的文本模式或搜索條件對目標文件進行逐行搜索,并顯示能匹配到的行。   …

    Linux干貨 2015-05-12
  • HipHop PHP實戰(詳解web運行模式)

    Note: These code examples assume the HipHop compiler is fully built. 1 . Setting Up Your Environment (構建環境) To get started, you need to configure two environment variables. cd…

    Linux干貨 2015-04-10
  • 為大家準備了幾道簡單的小題,不知道看過這篇文章后能否做出來?(考驗你能力的時候到了,接招吧。。。) 1、將0-9分別替代成a-j 2、將/etc/issue文件中的內容轉換為大寫后保存至/tmp/issue.out文件中 3、計算1+2+3+..+99+100的值 4、處理字符串“xt.,l 1 jr#!$mn2 c*/fe 3 uz 4”,只保留其中的數字…

    2017-07-22
  • Mariadb數據庫復制系列(一):主從復制

      實驗一:MySQL主從復制的實現 1、實驗環境 確保各節點之間的時間同步 2、修改主節點的mysql服務配置文件,讓其符合主從架構中主節點的要求 3、查看主節點現有數據情況和二進制日志使用情況 4、對主節點的數據利用xtrabackup進行完全備份 由于兩個從節點是后期加入,故采取備份主節點的數據,還原到從節點上,然后讓從節點從備份時刻的二進制日志的位置…

    2016-11-24
  • N22-第一周作業

    1、描述計算機的組成及功能      計算機系統由硬件系統和軟件系統組成。硬件系統(Hardware system)是計算機完成計算工作  的物質基礎。軟件系統(Software system):是在計算機硬件設備上運行的各種程序,是介于用戶  和硬件系統之間的界面。1.1 計算機的硬件系…

    Linux干貨 2016-08-22
欧美性久久久久