zoukankan      html  css  js  c++  java
  • mysql 索引

    索引的作用:约束和加速查找

    常见的几种的索引:

      - 普通索引

      - 唯一索引

      - 主键索引

      - 联合索引(多列)

        - 联合主键索引

        - 联合唯一索引

        - 联合普通索引

    区别:

      - 无索引:从前往后一条一条查询

      - 有索引:创建索引的本质,就是创建额外的文件(某种格式存储,查询的时候,先去格外的文件找,定好位置,然后再去原始表中直接查询。但是创建索引越多,会对硬盘也是有损耗。

    建索引的目的:

      - 额外的文件保存特殊的数据结构

      - 查询快,但是插入更新数据依然满

      - 创建索引以后,必须命中索引才能有效

    - 普通索引:

      - 创建:create index 索引的名字 on 表名(列名) 作用 :加速查找

      - 删除:drop index 索引名字 on 表名

      - 查看:show index from 表名

    - 唯一索引:

      - 作用:加速查找和唯一约束(可含null)

      - 创建:create unique index 索引名字 on 表名(列名)

      - 删除:drop index 索引名 on 表明

    - 主键索引:

      -作用:加速查找和唯一约束(不含null)

      - alter table 表名 add primary key(列名)

      - alter table 表明 drop primary key

    - 联合索引

      - select * from 表名 where 列名 and 列名

    =====================================================

    - 索引名词

    #覆盖索引:在索引文件中直接获取数据
            例如:
            select name from userinfo where name = 'wqz50000';
    
    
    #索引合并:把多个单列索引合并成使用
            例如:
            select * from  userinfo where name = 'wqz13131' and id = 13131;

    - 最左前缀:

      - 如果使用组合索引加上,name和Email组合索引之后,查询

      (1)name 和email ----使用索引

      (2)name     ---- 使用索引

      (3)Email    ---- 不适用索引

      - 对于同时搜索n个条件时,组合索引的性能好于多个单列索引

        - 组合索引的性能 > 索引合并的性能

    - 对于索引
    1.创建索引
    注意事项:
    (1)避免使用select *
    (2)count(1)或count(列) 代替count(*)
    (3)创建表时尽量使用char代替varchar
    (4)表的字段顺序固定长度的字段优先
    (5)组合索引代替多个单列索引(经常使用多个条件查询时)
    (6)尽量使用短索引 (create index ix_title on tb(title(16));特殊的数据类型 text类型)
    (7)使用连接(join)来代替子查询
    (8)连表时注意条件类型需一致
    (9)索引散列(重复少)不适用于建索引,例如:性别不合适
    2.命中索引
    3.正确使用索引
        
    注意事项:
    - like '%xx'
    select * from userinfo where name like '%al';
    - 使用函数
    select * from userinfo where reverse(name) = 'wqz333';
    - or
    select * from userinfo where id = 1 or email = 'wqz@sb';
    特别的:当or条件中有未建立索引的列才失效,以下会走索引
    select * from userinfo where id = 1 or name = 'wqz333';
    select * from userinfo where id = 1 or email = 'wqz@sb' and name = 'wqz333'
    - 类型不一致
    如果列是字符串类型,传入条件是必须用引号引起来,不然...
    select * from userinfo where name = 999;
    - !=
    select count(*) from userinfo where name != 'wqz'
    特别的:如果是主键,则还是会走索引
    select count(*) from userinfo where id != 123
    - >
    select * from userinfo where name > 'wqz'
    特别的:如果是主键或索引是整数类型,则还是会走索引
    select * from userinfo where id > 123
    select * from userinfo where num > 123
    - order by
    select email from userinfo order by name desc;
    当根据索引排序时候,选择的映射如果不是索引,则不走索引
    特别的:如果对主键排序,则还是走索引:
    select * from userinfo order by nid desc;

    - 组合索引最左前缀
    如果组合索引为:(name,email)
    name and email -- 使用索引
    name -- 使用索引
    email -- 不使用索引
    对于创建索引,它是真实存在的,占用硬盘空间,尽量不要使用索引
     



  • 相关阅读:
    Maven
    Mybatis
    WinDbg的安装、配置和功能(转发)
    gRPC —— gRPC 基础: C#(待续)
    gRPC —— 通讯协议
    gRPC —— 安全认证
    gRPC —— 概念
    gRPC —— 概览
    grpc和protocol buffer介绍&实例(转载)
    protocol buffers ——git 源码
  • 原文地址:https://www.cnblogs.com/lzmdbk/p/9811828.html
Copyright © 2011-2022 走看看