精华内容
下载资源
问答
  • 索引失效的几种情况
    2022-07-20 10:20:06

    1.前导模糊查询不能利用索引(like '%XX'或者like '%XX%')

             'A%'就可以正常使用索引

    2.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

    3.OR前后存在非索引的列,索引失效

            如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

            要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

    4.普通索引的不等于不会走索引;如果是主键,则还是会走索引;如果是主键或索引是整数类型,则还是会走索引

    5.组合索引最左前缀

            如果组合索引为:(name,email)

            name and email -- 使用索引

            name -- 使用索引

            email -- 不使用索引

    6.is null可以使用索引,is not null无法使用索引

            最好在设计表时设置NOT NULL约束,比如将INT类型的默认值设为0,将字符串默认值设为''。

    7.计算、函数导致索引失效另外一种情况

    #使用到了索引
    
    explain select * from student_info where name like 'li%';
    
    #未使用索引,花费时间更久
    
    explain select * from student_info where LEFT(name,2)='li';
    

    扩展:

    如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

    #不会使用name的索引
    
    explain select * from student_info where name=123;
    
    #使用到索引
    
    explain select * from student_info where name='123';

    如上,name字段是VARCAHR类型的,但是比较的值是INT类型的,name的值会被隐式的转换为INT类型再比较,中间相当于有一个将字符串转为INT类型的函数。这也相当于是函数导致的索引失效。

    8.字符集不统一

    统一使用utf8mb4( 5.5.3 版本以上支持 ) 兼容性更好,统一字符集可以避免由于字符集转换产生的乱码。不同的 字符集 进行比较前需要进行 转换 会造成索引失效。。

    更多相关内容
  •  二、索引失效几种情况  1.如果条件中有多个字段使用or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。多条件查询用同一字段时使用or索引会生效。 注意:要想使用or,又想让索引生效,只能...
  • 文章目录1、不满足最左前缀匹配原则2、like查询3、IS NOT NULL 和 IS NULL4、对索引列进行操作5、OR 1、不满足最左前缀匹配原则 最左前缀匹配原则: 以最左边的索引为起点,连续的索引都能使用,除非碰到范围查询(&...

    1、不满足最左前缀匹配原则

    最左前缀匹配原则: 以最左边的索引为起点,连续的索引都能使用,除非碰到范围查询(>、<、between、like),= 和 in 的查询语句可以调换顺序;

    -- 建表
    create table staffs(
    id INT PRIMARY KEY,
    name VARCHAR(200),
    age INT,
    pos VARCHAR(200),
    add_time TIMESTAMP
    );
    create index idx_name_age_pos on staffs(name,age,pos);
    

    2、like查询

    1、查询的列刚好是索引列,则 like %key%、like %key、like key%时,索引均生效;

    EXPLAIN select name,age,pos from staffs where name like '%3%';
    

    在这里插入图片描述

    EXPLAIN select name,age,pos from staffs where name like '%3';
    

    在这里插入图片描述

    EXPLAIN select name,age,pos from staffs where name like '3%';
    

    在这里插入图片描述

    2、查询的列中有的不是索引列,则 like %key%like %key、时,索引均失效,**like key%**时索引生效;

    EXPLAIN select name,age,pos,add_time from staffs where name like '%3%';
    

    在这里插入图片描述

    EXPLAIN select name,age,pos,add_time from staffs where name like '%3';
    

    在这里插入图片描述

    EXPLAIN select name,age,pos,add_time from staffs where name like '3%';
    

    在这里插入图片描述

    3、IS NOT NULL 和 IS NULL

    IS NOT NULL不走索引,IS NULL走索引;(此处存疑)

    4、对索引列进行操作

    对索引列进行计算、函数、(手动或自动)类型转换,索引会失效;
    字符串不加’’,索引失效,因为mysql会自动进行类型转换;

    EXPLAIN select * from staffs where name = 2000;
    

    在这里插入图片描述

    5、OR

    索引列A or 索引列B
    索引列A or 非索引列B
    以上三种情况,均可能会出现索引失效

    drop index idx_name_age_pos on staffs;
    create index idx_name on staffs(name);
    create index idx_pos on staffs(pos);
    EXPLAIN select name,pos from staffs where name = '2000' OR pos = 'dev';
    

    在这里插入图片描述

    EXPLAIN select name,age from staffs where name = '2000' OR age = '23';
    

    在这里插入图片描述

    展开全文
  • 更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本 没Null值,不能利用到索引,只能全表扫描。 为什么索引列不能存Null值? 将索引列...
  • 索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)    注意:要想使用or,又想让索引生效,只能将or条件中的每个...
  • 索引失效几种情况

    千次阅读 2022-06-01 08:00:39
    MySQL:索引失效几种情况

    1. MySQL 可以为多个字段创建索引,一个索引可以包括 16 个字段。对于多列索引,过滤条件要使用索引,必须按照索引建立的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。如果查询条件中没有使用这些字段中第 1 个字段时,多列(或联合)索引不会被使用。

    2. 计算、函数、类型转换(自动或手动)导致索引失效

    3. 范围条件右边的列索引失效

    应用开发中范围查询,例如:金额查询,日期查询往往都是范围查询。应将查询条件放置 WHERE 语句最后。(创建的联合索引中,务必把范围涉及到的字段写在最后)

    4. 不等于( != 或者 <> )索引失效

    5. is null 可以使用索引,is not null 无法使用索引

    最好在设计数据表的时候就将字段设置为 NOT NULL 约束,比如可以将 INT 类型的字段,默认值设置为 0。将字符类型的默认值设置为空字符串 '' 。同理,在查询中使用 not like 也无法使用索引,导致全表扫描

    6. like 以通配符 % 开头索引失效

    Alibaba《Java开发手册》,强制要求:页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决

    7.  OR 前后存在非索引的列,索引失效

    8. 数据表和表的字符集统一使用 utf8mb4

    统一使用 utf8mb4 (5.5.3版本以上支持)兼容性更好,统一字符集可以避免由于字符集转换产生的乱码。不同的字符集进行比较前需要进行转换会造成索引失效。

    展开全文
  • 索引并不是时时都会生效的,比如以下几种情况,将导致索引失效:  1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)  注意:要想使用or,又想让索引生效,只能将or条件中的每个...
  • oracle数据库索引失效

    2021-01-19 22:45:53
    但是如果是同样的sql如果在之前能够使用到索引,那么现在使用不到索引,以下几种主要情况: 1. 随着表的增长,where条件出来的数据太多,大于15%,使得索引失效(会导致CBO计算走索引花费大于走全表) 2. 统计信息...
  • 总结索引失效几种情况

    千次阅读 2021-01-05 15:34:22
    索引失效几种情况 1) 没有查询条件,或者查询条件没有建立索引2) 在查询条件上没有使用引导列3)查询的数量是大表的大部分,应该是30%以上。4) 索引本身失效5)查询条件使用函数在索引列上(见12)6) 对小表查询7...

    http://blog.sina.com.cn/s/blog_1442877660102w06n.html

    索引失效的几种情况

    1) 没有查询条件,或者查询条件没有建立索引 
    2) 在查询条件上没有使用引导列 
    3) 查询的数量是大表的大部分,应该是30%以上。 
    4) 索引本身失效 
    5) 查询条件使用函数在索引列上(见12) 
    6) 对小表查询 
    7) 提示不使用索引 
    8) 统计数据不真实 
    9) CBO计算走索引花费过大的情况。其实也包含了上面的情况,这里指的是表占有的block要比索引小。 
    10)隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20), 
    但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效. 
    错误的例子:select * from test where tu_mdn=13333333333; 
    正确的例子:select * from test where tu_mdn='13333333333'; 
    11)对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等) 
    错误的例子:select * from test where id-1=9; 
    正确的例子:select * from test where id=10; 
    12)使用Oracle内部函数导致索引失效.对于这样情况应当创建基于函数的索引. 
    错误的例子:select * from test where round(id)=10; 
    说明,此时id的索引已经不起作用了 正确的例子:首先建立函数索引, 
    create index test_id_fbi_idx on test(round(id)); 
    然后 select * from test where round(id)=10; 这时函数索引起作用了 1,<> 2,单独的>,<,(有时会用到,有时不会) 
    3,like "%_" 百分号在前. 
    4,表没分析. 
    5,单独引用复合索引里非第一位置的索引列. 
    6,字符型字段为数字时在where条件里不添加引号. 
    7,对索引列进行运算.需要建立函数索引. 

    8,not in ,not exist. 
    9,当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。 
    10, 索引失效。 
    11,基于cost成本分析(oracle因为走全表成本会更小):查询小表,或者返回值大概在10%以上 
    12,有时都考虑到了 但就是不走索引,drop了从建试试在 
    13,B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走 
    联合索引的not NULL比较麻烦,实际需要测试
    14,联合索引 is not null 只要在建立的索引列(不分先后)都会走, 
    in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时, 
    其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候), 
    或者=一个值;当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值), 
    以上两种情况索引都会走。其他情况不会走。
    展开全文
  • 文章来源: 学习通http://www.bdgxy.com/普学网http://www.boxinghulanban.cn/智...分析:该查询缺少username,查询条件复合索引最左侧username缺少,违反了最佳左前缀原则,导致索引失效,变为ALL,全表扫描 分析:
  • 【学习】数据库:索引失效几种情况
  • 一、索引失效几种情况 建立员工记录表staffs(id,name,age,pos,add_time) 给表中name,age,pos字段添加索引(注意三个字段的顺序) alter table staff add index idx_staffs_nameAgePos(name,age,pos) ①最佳左...
  • 以下几种情况就会导致索引失效:0.没有 WHERE 子句众所周知,添加索引的字段必需要在where条件后适当使用才会生效,如果连查询条件都没有,那肯定不会用到索引的。1.隐式转换导致索引失效.这一点应当引起重视.也是...
  • MySQL: 索引失效几种情况

    千次阅读 2021-02-02 06:51:33
    1.前导模糊查询不能利用索引(like '%XX'或者like '%XX%')假如有这样一列code的值为'AAA','AAB','BAA','BAB' ,如果where code like '%AB'条件,由于前面是模糊的,所以不能利用索引的顺序,必须一个个去找,看是否...
  • 以下几种情况就会导致索引失效: 1. 没有 WHERE 子句 众所周知,添加索引的字段必需要在where条件后适当使用才会生效,如果连查询条件都没有,那肯定不会用到索引的。 2. 使用 IS NULL 和 IS NOT NULL select ...
  • sql索引失效几种情况

    千次阅读 2020-09-10 18:38:24
    sql索引失效几种情况 1、使用 != 或者 <> 导致索引失效 2、类型不一致导致索引失效 3、函数导致索引失效 4、运算符导致索引失效 5、模糊搜索导致索引失效 6、NOT IN、NOT EXISTS导致索引失效, in 是走索引...
  • SQL索引失效几种情况

    千次阅读 2021-01-16 16:09:17
    1、 没有正确使用符合索引 例如我们根据user表中的A,B,C创建一个符合索引 create index on user(A,B,C) 实际上mysql是为我们创建了三个索引 ...3、对索引列进行运算,索引失效 select A from user
  • MySQL索引失效几种情况

    千次阅读 2021-08-24 19:57:38
    MySQL索引失效几种情况 1、全值匹配我最爱 (这种情况下索引不会失效) 全值匹配意思就是联立的复合索引的顺序和个数要和检索的条件顺序和个数相同。 2、最佳左前缀法则(重要) 最佳左前缀法则是指,如果索引了多...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,189
精华内容 31,675
关键字:

索引失效的几种情况

友情链接: Rect_overlap.zip