mysql 索引的主要事项

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<x

  10、默认值是NULL的数据索引不起作用,所以定义字段的时候,尽量用not null default 0等来定义。

猜你喜欢

转载自www.cnblogs.com/mengzhilva/p/10840224.html