日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2023/12/10 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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上都建有索引.

高效:

selectloc_id?,?loc_desc?,?regionfromlocationwhereloc_id?=?10

union

selectloc_id?,?loc_desc?,?regionfromlocationwhereregion?="melbourne"

低效:

selectloc_id?,?locdesc,?regionfromlocationwhereloc_id?=?10orregion?="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条件可以使用索引而避免全表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。