起
問:一條sql語句只能用一個索引么机蔗?
SELECT * FROM `comment` WHERE `toconuid` = '10' or `tocomuid` = '10'
其中 toconuid列 和 tocomuid列 分別為單列索引
explain后 顯示兩個索引都用了拷窜,extra為 Using union(toconuid,tocomuid); Using where
答:凡事總有特列兑宇。
而MYSQL可以理解為把這個語句拆成了兩條語句
SELECT * FROM `comment` WHERE `toconuid` = '10'
union
SELECT * FROM `comment` WHERE `tocomuid` = '10'
在某些情況下氢架,or條件可以避免全表掃描的鹏溯。
4個關于or的問題
-
where 語句里面如果帶有or條件,myisam表能用到索引旺罢, innodb不行
以下分別是使用myisam與innodb的表格在explain后的情況:
表格為:
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=utf8 AUTO_INCREMENT=1 ;
此時在id以及uid列都設置了索引系冗,分別設置engine為不同引擎奕扣,為myisam的時候:
設置為innodb的時候:
必須所有的or條件都必須是獨立索引(innodb還要求是在同一個索引列下面的or)
用UNION替換OR。(適用于索引列)通常情況下,用UNION替換WHERE子句中的OR將會起到較好的效果.對索引列使用OR將造成全表掃描. 注意,以上規(guī)則只針對多個索引列有效.如果有column沒有被索引,查詢效率可能會因為你沒有選擇OR而降低.
用in來替換or
低效:
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和in的效率問題
- in或or在字段有添加索引的情況下掌敬,查詢很快惯豆,兩者查詢速度沒有什么區(qū)別;
- in或or在字段沒有添加索引的情況下,所連接的字段越多(1or2or3or4or......)奔害,or比in的查詢效率低很多楷兽,or的效率為O(n),而in的效率為O(logn)
為何推薦在沒有索引的情況下使用in呢华临?
- OR芯杀,就是從a1匹配,匹配失敗雅潭,去匹配a2揭厚,直到匹配成功或者一個都匹配不上,時間復雜度O(n)
- IN扶供,先將a1, a2, ..., an變成二叉樹筛圆,通過二叉樹查找,時間復雜度O(log n)