• mysql索引种类(索引种类和建立索引)


    一、mysql索引种类

    1、加速查找:

      查找普通字段和查找有索引字段,哪个方式查找速度快:根据索引来查字段速度更快

    2、创建索引:

    为userinfo表email字段创建索引:  create index ix_name on userinfo<email>;     #创建字段email索引文件,起别名ix_name

    为某个字段创建索引会创建额外文件(某种格式存储),下次查询这个字段,先去文件中查找数据在表中的位置,拿着这位置去表中定位数据。(类似于查字典)

    3.索引种类   

    hash索引:索引表(无序的排列)
    把数据转换成一个hash值(数值),放在索引表里面,再加上这个数据的存储地址
    查找的时候会根据数据查找到存储地址。
    注意:数据库的值和索引表存的数值顺序是不一样的。因为这个是无序的排列,所以在数据库中查找大于/小于多少的数据可能花的时间更长。
    缺点:在某个范围查找数据速度慢         优点:查找单值速度快
    
    btree索引:
        二叉树
    #不同的存储引擎支持的索引类型也不一样
    InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
    MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
    Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
    NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
    Archive 不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;

    4.建立索引

    1.额外的文件保存特殊的数据结构
    2.查询快,插入更新删除慢
    3.命中索引(使用索引表)

    普通索引

    普通索引仅有一个功能:加速查询

    创建表+普通索引

    create table in1(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        index ix_name (name)    #ix_name是索引名,name字段建立索引
    )

    创建索引

    create index ix_name on table_name(column_name);

    删除索引

    drop index ix_name on table_name;

    查看索引

    show index from table_name;

    唯一索引

    唯一索引有两个功能:加速查询和唯一约束(可含null)

    创建表+唯一索引

    create table in1(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        unique ix_name (name)
    )

    创建唯一索引

    create unique index 索引名 on 表名(列名)

    删除唯一索引

    drop unique index 索引名 on 表名

    主键索引

    主键有两个功能:加速查询 和 唯一约束(不可含null)

    创建表+创建主键

    create table in1(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        index ix_name (name)
    )
    
    OR
    
    create table in1(
        nid int not null auto_increment,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        primary key(ni1),
        index ix_name (name)
    )

    创建主键

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

    删除主键

    alter table 表名 drop primary key;
    alter table 表名  modify  列名 int, drop primary key;

    联合索引

    联合索引是将n个列组合成一个索引

    其应用场景为:频繁的同时使用n列来进行查询,如:where n1 = 'alex' and n2 = 666

    创建表

    create table in3(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text
    )

    创建联合索引

    create index ix_name_email on in3(name,email);     #就是在()中写多个列名

    最左前缀匹配,查询:

    • name and email  -- 使用索引
    • name                 -- 使用索引
    • email                 -- 不使用索引  (因为email字段在右边)

    注意:对于同时搜索n个条件时,组合索引的性能好于索引合并。

    5.不真实存在的索引

    名词:

      覆盖索引:在索引文件中直接获取数据

      索引合并:使用多个单列索引搜索

    索引合并示例:  

    select *  from tb1 where name = 'alex' or nid in (11,22,33);    #这里name,nid字段都是索引
  • 相关阅读:
    python中map函数
    python中的or,and运算符
    输入一个字符串, 返回倒序排列的结果 如: abcdef, 返回 fedcba
    centos7启用iptables
    centos7 shell脚本批量上传文件
    Deployment 中尝试声明一个 Volum
    cpu很高,但是看不到是哪个应用或进程
    从进程角度看docker容器
    02一条update的sql的内部执行流程
    01基础架构,一条SQL查询语句是如何执行的?
  • 原文地址:https://www.cnblogs.com/wangcuican/p/12306399.html
Copyright © 2020-2023  润新知