在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 當被...