mysql哪些情況不走索引

2021-09-24 18:44:43 字數 2580 閱讀 7756

在mysql中,並不是你建立了索引,並且你在sql中使用到了該列,mysql就肯定會使用到那些索引的,有一些情況很可能在你不知不覺中,你就「成功的避開了」mysql的所有索引。

現假設有t_stu表,age,sname上建立了索引

如果where條件中age列中使用了計算,則不會使用該索引

select

`sname`

from

`t_stu`

where

`age`=20

;-- 會使用索引

select

`sname`

from

`t_stu`

where

`age`+10

=30;-- 不會使用索引!!因為所有索引列參與了計算

select

`sname`

from

`t_stu`

where

`age`=30

-10;-- 會使用索引

故,如果需要計算,千萬不要計算到索引列,想方設法讓其計算到表示式的另一邊去。

同樣的道理,索引列使用了函式,一樣會導致相同的後果

select

`sname`

from

`stu`

where concat(

`sname`

,'abc')=

'jaskeyabc'

;-- 不會使用索引,因為使用了函式運算,原理與上面相同

select

`sname`

from

`stu`

where

`sname`

=concat(

'jaskey'

,'abc');

-- 會使用索引

select

*from

`houdunwang`

where

`uname`

like

'字首就走索引%'

-- 走索引

select

*from

`houdunwang`

where

`uname`

like

'字尾不走索引%'

-- 不走索引

所以當需要搜尋email列中.com結尾的字串而email上希望走索引時候,可以考慮資料庫儲存乙個反向的內容reverse_email

select

*from

`table

`where

`reverse_email`

like reverse(

'%.com');

-- 走索引

注:以上如果你使用reverse(email) = reverse(』%.com』),一樣得不到你想要的結果,因為你在索引列email列上使用了函式,mysql不會使用該列索引

同樣的,索引列上使用正規表示式也不會走索引。

這是乙個坑,假設有一張表,裡面的a列是乙個字元char型別,且a上建立了索引,你用它與數字型別做比較判斷的話:

create

table

`t1`

(`a`

char(10

));select

*from

`t1`

where

`a`=

'1'-- 走索引

select

*from

`t2`

where

`a`=

1-- 字串和數字比較,不走索引!

但是如果那個表那個列是乙個數字型別,拿來和字元型別的做比較,則不會影響到使用索引

create

table

`t2`

(`b`

int)

;select

*from

`t2`

where

`b`=

'1'-- 雖然b是數字型別,和'1'比較依然走索引

但是,無論如何,這種額外的隱式型別轉換都是開銷,而且由於有字元和數字比就不走索引的情況,故建議避免一切隱式型別轉換

select

*from dept where dname=

'jaskey'

or loc=

'bj'

or deptno=

45--如果條件中有or,即使其中有條件帶索引也不會使用。換言之,就是要求使用的所有字段,都必須建立索引

所以除非每個列都建立了索引,否則不建議使用or,在多列or中,可以考慮用union 替換

select

*from dept where dname=

'jaskey'

union

select

*from dept where loc=

'bj'

union

select

*from dept where deptno=

45

**

Mysql中哪些Sql不走索引

select sname from stu where age 10 30 不會使用索引,因為所有索引列參與了計算 select sname from stu where left date 4 1990 不會使用索引,因為使用了函式運算,原理與上面相同 select from houdunwang...

mysql不走索引總結

在mysql查詢語句中,總會發現明明已經建立了查詢字段索引,可是卻沒有用到,這是因為在mysql中有些查詢語句是用不到索引的,總結如下,以供大家分享。1.like語句 2.列型別為字串型別,查詢時沒有用單引號引起來 3.在where查詢語句中使用表示式 4.在where查詢語句中對字段進行null值...

oracle 不走索引的幾種情況

1 建立組合索引,但查詢謂詞並未使用組合索引的第一列,此處有乙個index skip scan概念。2 在包含有null值的table列上建立索引,當時使用select count from table時不會使用索引。3 在索引列上使用函式時不會使用索引,如果一定要使用索引只能建立函式索引。4 當被...