1 回答

TA貢獻1796條經(jīng)驗 獲得超10個贊
這個要分具體情況,如果是sql中a和b都是等值條件,那么無論索引是(a,b)還是(b,a)都可以用到;但如果a和b有范圍條件,比如select * from table where a=xx,b>xx;
這里b>xx是范圍條件,假設(shè)你有兩個索引(a,b)和(b,a),那么這條sql語句數(shù)據(jù)庫優(yōu)化器會用到索引(a,b);如果只有索引(b,a),語句也可以用到此索引,但根據(jù)最左原則,只能用到用到索引中的b列,a列的查找就用不到索引必須得回表查詢。這里牽扯到數(shù)據(jù)庫mysql的索引B+tree結(jié)構(gòu)原理,講起來內(nèi)容就太多了,建議有時間去看一下二叉樹、b樹、b+樹以及二分查找法的原理。
如果沒時間,這里有一個比較好記的方法,就是如果sql語句where條件都是等值的,那么索引列的順序沒那么重要(但根據(jù)最左原則,索引最左列最好還是使用選擇性高的列);如果sql條件中有范圍條件,那么在索引列的順序就很重要了,關(guān)系到能不能命中索引,簡單來說,索引中范圍條件要盡量往右邊放,比如select * from table a=xx,b=xx,c<xx;那么在創(chuàng)建索引時就需要盡量把c列放最后,(a,b,c)或(b,a,c),如果是(c,a,b),雖然也能用到索引,但效率會很差。
- 1 回答
- 0 關(guān)注
- 1127 瀏覽
添加回答
舉報