zoukankan      html  css  js  c++  java
  • mysql -- 索引补充

    1.unique索引补充:联合唯一
    
      unique(name,email)是name和email这两列联合起来唯一,不再试某个字段唯一
    
    2.主键索引,类似唯一索引,也是允许联合多个字段作为主键,例如:primary(nid,name)
    
    3.组合索引,多列共同组成索引
      注意:例如index(name,email)---->最左前缀
          select* from info where name='xxx' and email ='xxx' 是走索引的
          select* from info where name='xxx'            是走索引的
          select* from info where email ='xxx'          是不走索引的

    索引分类:

    普通索引:仅仅起到加速查询作用
    唯一索引:加速查询+列值唯一(可以为null)
    主键索引:加速查询+列值唯一+表中只有一个(不可以为null)
    组合索引:多列值组合成一个所有,专门用于组合搜索,效率会大于索引合并
    全文索引:对文本内容进行索引,进行搜索,一般不会使用,会使用插件等加速全文索引的查找效率

    查看表中索引

    show index from 表名

    单独创建索引

    create index 名字 on 表(列)

    获取索引等级type:const(效率几乎是最高的),all(全表扫描,效率最低),

    等级划分:

    all:去数据表全表扫描
    index:去索引表扫描
    range:对索引列进行范围查找,除了!=和>符号以外的范围操作
    index_merge:合并索引,使用多个单列索引搜索
    ref:根据索引查找一个或多个
    eq_ref:唯一索引操作,只能拿到一个数据
    const:常量,值匹配到一行
    system:几乎用不到
    explain select * from info where name = 'xxx'    ---type:all/const/..

    注意:不是建立了索引,就会加快查找速率,若是建立索引,但是使用错误的方式去操作,会导致索引变慢,变成全表扫描(默认)。

    例如:name没有建立索引

    select * from info where name='aaa';//第一条,但是其依旧会全表扫描

    limit使用:在没有建立索引时使用会加快查找速率

    select * from info where name='aaa' limit 1;//第一条,但是找到第一条后就返回,但是还是最后一条,搜索还是非常慢的

    但是正确的索引建立和使用会使查询效率变得非常快

    重点(正确使用索引)

    1.like '%xx'

    select * from info where name like '%三';

    上面这种情况即使建立例索引,也不会去走这个索引

    select * from info where name like '张%';

    这种情况会走索引

    2.使用函数

    对索引列加函数也不能走索引,因为会对每一个索引列的值都取出用函数处理,导致索引不能使用

    select * from info where reverse(name) = '四李';//name是建立了索引的

    修改,是函数添加到后面的数据上,只会执行一次函数

    select * from info where name = reverse('四李');//name是建立了索引的

    3.or作为条件

    当两边中的列,若是一方没有建立索引,则不能走索引,必须两方都建立索引才行

    4.类型不一致

    select * from info where name='张三'; //name是建立的索引,类型varchar,一致可以走索引

    但是

    select * from info where name=33; //name是建立的索引,类型varchar,数据为int类型,不一致不可以走索引

    5.比较符号

    大于和不等于不会走索引,会去全表扫描

    6.order by

    当根据索引排序的时候,选择的映射如果不是索引,则不会走索引

    select name from info order by age desc //age是所有,映射name也是索引
    当映射不是索引不会走索引
    select score from info order by age desc //score不会是索引不会走索引

    特别的,对于主键还是会走索引的

    7.组合索引最左前缀

    补充:

    覆盖索引

    在创建索引时,会将索引和数据分为两个文件存储

    例如name创建索引了

    select name from info where name='ls';

    索引合并

    单独的索引,联合使用
    select * from info where name='ls' and gender='1'; //index(name) index(gender)

    组合索引

    效率高于索引合并

    组合索引
    select * from info where name='ls' and gender='1'; //index(name,gender)

    注意事项

    1.尽量少用select*,尽量少取多余数据出来

    2.count(1)或者count(列)代替count(*)

    3.创建表的时候,尽量使用char,少使用varchar,char更易检索

    4.固定字节int,char,tinyint等往前放,类似于结构体,固定长度的步长确定,易于跳转,不定长度需要计算步长,动态操作

    5.组合索引代替多个单列索引(当经常使用多个条件同时查询时)

    6.尽量使用短索引:像一堆字符串,若是前面几位已经不同,则不需要将所有的字符串都建立索引,导致索引文件过大,降低效率

    7.使用连接join代替子查询

    8.连表示注意类型一致

    9.所有散列值不适合建立索引,例如性别

  • 相关阅读:
    【OpenGL】Shader实例分析(七)- 雪花飘落效果
    BZOJ 1091([SCOI2003]分割多边形-分割直线)
    Protocol buffer序列化及其在微信蓝牙协议中的应用
    运行计划中cost计算方法
    jquery全局变量---同步请求设置
    Java split字符串中包含.的情况
    jQuery获取、设置title的值
    jQuery获取URL中所带参数的办法
    在Eclipse中提交SVN项目的时候注意提交项目信息
    马丁 福勒 Martin Fowler 关于依赖注入和反转控制的区别
  • 原文地址:https://www.cnblogs.com/ssyfj/p/8551912.html
Copyright © 2011-2022 走看看