mysql關于or的索引問題

問:一條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的問題

  1. 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的時候:

    or_myisam.PNG

    設置為innodb的時候:

    or_innodb.PNG
  2. 必須所有的or條件都必須是獨立索引(innodb還要求是在同一個索引列下面的or)

  3. UNION替換OR。(適用于索引列)通常情況下,用UNION替換WHERE子句中的OR將會起到較好的效果.對索引列使用OR將造成全表掃描. 注意,以上規(guī)則只針對多個索引列有效.如果有column沒有被索引,查詢效率可能會因為你沒有選擇OR而降低.

  4. 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的效率問題

  1. in或or在字段有添加索引的情況下掌敬,查詢很快惯豆,兩者查詢速度沒有什么區(qū)別;
  2. in或or在字段沒有添加索引的情況下,所連接的字段越多(1or2or3or4or......)奔害,or比in的查詢效率低很多楷兽,or的效率為O(n),而in的效率為O(logn)

為何推薦在沒有索引的情況下使用in呢华临?

  • OR芯杀,就是從a1匹配,匹配失敗雅潭,去匹配a2揭厚,直到匹配成功或者一個都匹配不上,時間復雜度O(n)
  • IN扶供,先將a1, a2, ..., an變成二叉樹筛圆,通過二叉樹查找,時間復雜度O(log n)

參考:http://www.cnblogs.com/lixiuyuan999/p/6368871.html

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诚欠,一起剝皮案震驚了整個濱河市顽染,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌轰绵,老刑警劉巖粉寞,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異左腔,居然都是意外死亡唧垦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門液样,熙熙樓的掌柜王于貴愁眉苦臉地迎上來振亮,“玉大人,你說我怎么就攤上這事鞭莽》唤眨” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵澎怒,是天一觀的道長褒搔。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么星瘾? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任走孽,我火速辦了婚禮,結(jié)果婚禮上琳状,老公的妹妹穿的比我還像新娘磕瓷。我一直安慰自己,他們只是感情好念逞,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布困食。 她就那樣靜靜地躺著,像睡著了一般肮柜。 火紅的嫁衣襯著肌膚如雪陷舅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天审洞,我揣著相機與錄音莱睁,去河邊找鬼。 笑死芒澜,一個胖子當著我的面吹牛仰剿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痴晦,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼南吮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了誊酌?” 一聲冷哼從身側(cè)響起部凑,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碧浊,沒想到半個月后涂邀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡箱锐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年比勉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驹止。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡浩聋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出臊恋,到底是詐尸還是另有隱情衣洁,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布抖仅,位于F島的核電站坊夫,受9級特大地震影響毙替,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜践樱,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凸丸。 院中可真熱鬧拷邢,春花似錦、人聲如沸屎慢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腻惠。三九已至环肘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間集灌,已是汗流浹背悔雹。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欣喧,地道東北人腌零。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像唆阿,于是被迫代替她去往敵國和親益涧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 一摔握、MySQL架構(gòu)與歷史 A.并發(fā)控制 1.共享鎖(shared lock寄狼,讀鎖):共享的,相互不阻塞的氨淌。 2.排...
    阿休閱讀 4,641評論 0 37
  • MySQL邏輯架構(gòu) 下面是一幅MySQL各組件之間如何協(xié)同工作的架構(gòu)圖泊愧,有助于我們深入理解MySQL服務器。 如圖...
    騎小豬看流星閱讀 4,804評論 2 135
  • Mysql概述 數(shù)據(jù)庫是一個易于訪問和修改的信息集合盛正。它允許使用事務來確保數(shù)據(jù)的安全性和一致性删咱,并能快速處理百萬條...
    彥幀閱讀 13,674評論 10 461
  • 索引 數(shù)據(jù)庫中的查詢操作非常普遍痰滋,索引就是提升查找速度的一種手段 索引的類型 從數(shù)據(jù)結(jié)構(gòu)角度分 1.B+索引:傳統(tǒng)...
    一凡呀閱讀 2,914評論 0 8
  • 一摘能、MySQL架構(gòu)與歷史 A.并發(fā)控制 1.共享鎖(shared lock,讀鎖):共享的敲街,相互不阻塞的 2.排他...
    ZyBlog閱讀 19,835評論 3 177