現假設有t_stu表,age,sname上建立了索引
如果where條件中age列中使用了計算,則不會使用該索引
同樣的道理,索引列使用了函式,一樣會導致相同的後果
select * from `houdunwang` where `uname` like '字首就走索引%' -- 走索引
select * from `houdunwang` where `uname` like '字尾不走索引%' -- 不走索引
解決辦法:
這是乙個坑,假設有一張表,裡面的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'比較依然走索引
所以除非每個列都建立了索引,否則不建議使用or,在多列or中,可以考慮用union 替換
select * from dept where dname='jaskey' union
select * from dept where loc='bj' union
select * from dept where deptno=45
mysql哪些情況下索引會失效
索引並不是時時都會生效的,比如以下幾種情況,將導致索引失效 如果條件中有or,即使其中有條件帶索引也不會使用 這也是為什麼盡量少用or的原因 注意 要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引 2.對於多列索引,不是使用的第一部分,則不會使用索引 3.like查詢是以 開頭 4....
MYSQL中哪些情況會導致索引失效
1.以 開頭的like查詢 優化方案 首先掃瞄二級索引獲取滿足條件的primary key,在根據主鍵回表查詢。select from select actor id from actor where last name like ni tmp inner join actor a on a.act...
哪些情況下Mysql索引會失效
1 全值匹配我最愛 2 最佳左字首法則 3 不在索引列上做任何操作 計算 函式 自動or手動 型別轉換 會導致索引失效而轉向全表掃瞄 4 儲存引擎不能使用索引中範圍條件右邊的列 5 盡量使用覆蓋索引 只訪問索引的查詢 索引列和查詢列一致 減少select 6 mysql 在使用不等於 或者 的時候有...