mysql 无法使用索引的查询
索引是什么,为什么要用索引,索引使用的时候要注意什么,那些情况下索引无法起作用。
1,索引是什么
mysql的索引也是一张表,并且是一个有序的表,主要记录了需要索引的数据的物理地址,在数据量巨大的时候,查询某些值,不需要进行全表扫描,就可以找到对应的值,大大加快查询速度。
2,为什么用索引,索引使用的时候要注意什么
前文已经说过,索引可以大大的加快数据查询的速度,当数据量巨大的时候,加索引比不加索引的速度有指数级的增加。
但是,并不是所有的字段都加索引,有些情况下比必要的索引会增加数据查询和存储的时间。
1,小表不需要加索引,数据量小的表会增加存储空间,减缓查询速度。
2、频繁更新的表不适合加过多的索引,因为每次更新操作都需要重建索引,虽然查询速度加快,但更新却会变慢。
3、字段建立索引的原则
优先建立唯一索引,唯一索引的速度是最快的。
建立索引的字段尽量是短字段,索引也是需要占用磁盘空间,短字段更加适合,而且长字段也会增加查询时间。
表的索引并不是越多越好,适合的字段索引才能加快查询速度。
经常排序分组的字段需要加上索引。
尽量避免NULL
一个表多个索引的建立需要符合最左原则
3,那些情况下索引无法起作用
加了索引的表,并不是都起作用,在某些查询条件下,索引并不运行。
1,查询的条件含有计算、函数的。
select * from test where id-1=9;
select * from test where sbustring(a,4)='abc';
2、查询得到的数据是表数据的%30以上。
3、隐式转换将不会使用索引。
a的类型是int
select * from test where a='151111';将不会使用索引。
4、or的条件,前面有索引,后面的字段没有索引,则正条查询不用索引。
5、复合索引的时候,如果条件不是复合索引的第一个值,则不会使用索引(最左原则)
test只有复合索引(name,classid);
select * from test where classid=3;将不用索引
6、like是以%开始的条件不会使用索引。
7、jion的两端条件的主键和外键字段类型必须是相同的。
8、不要给‘性别’等值是固定数目的值加索引
9、not in和<>的条件不会使用索引,
not in可以用not exists,<>可以用 a>x and a
10、默认值是NULL的数据索引不起作用,所以定义字段的时候,尽量用not null default 0等来定义。