zoukankan      html  css  js  c++  java
  • mysql重点--索引

    1.关于索引

    # 什么是索引

    索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。

    #索引的作用

    加速查询和约束。

    # 为什么索引查询会变快

    没创建一个索引会相应的创建一个索引表。索引表是由相应的数据和B-tree数字组成:

                    30

     
            10                        40
     
       5         15            35             66
     
    1   6     11    19      21      39     55     100
    观察数据结构可知,每一个数字的左下比他小右下比他大。

    上述的数字结构就是B-tree数字组成的索引目录,相应的每一个数字代表一个索引目标。若是索引列有1024个数据,

    那么会生成10层这样的数据。也就是在找寻每一个索引目标平均为10次。而没有创建索引的列在寻找的时候要遍历

    整个数据结构,即最多1024次。提升的速率可想而知。

    2.索引类型

    • 普通索引
    • 唯一索引
    • 主键索引
    • 组合索引
    • =========分割===========
    • 覆盖索引
    • 全文索引
    • 索引合并

    普通索引 index

      功能:加速查找 

      条件:无(可以为空,可以重复)

      创建方法:

        1.创建table时创建

        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 为索引的名字

        2.table创建好后添加(必须符合索引条件)

      create index index_name on table_name(column_name)

    唯一索引 unique

      功能:加速查找 

      条件:不能重复,可以是null。

      创建方法:

        1.创建table时创建

        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) )
        其中ix_name 为索引的名字

        2.table创建好后添加(必须符合索引条件)

        create unique index index_name on table_name(column_name);

    主键索引 primary key

      主键是特殊的索引,在创建主键的同时已经创建好了索引表。

      功能:加速查找 

      条件:不能重复,不能null。

      创建方法:

        1.创建table时创建

        create table in1(

          nid int not null auto_increment primary key,

          name varchar(32) not null,

          email varchar(64) not null,

           )

        or

        create table in1(

          nid int not null auto_increment ,

          name varchar(32) not null,

          email varchar(64) not null,

          primary key(nid)

           )

        2.table创建好后添加(必须符合索引条件)

        alter table table_name add primary key(nid);

      删除主键

        alter table 表名 drop primary key;

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

    组合索引

      组合索引又叫联合(普通,唯一)索引。其实就是创建索引时变为多列。

      功能:加速查找 

      条件:根据创建形式

      创建方法:

        1.创建table时创建

        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,nid) )   # 联合唯一索引,也别的是两列的唯一指的是合起来的唯一。

          (“ccc”,3)和(“ccc”,4)可以存在。
        其中ix_name 为索引的名字

        2.table创建好后添加(必须符合索引条件)

        create unique index index_name on table_name(column_name);

      注意:

        组合索引遵循最左匹配。即(nid,name,addr)在这个组合索引中,若是有

        select * from table_name where name = "fff" and addr = "seatle"

        这样的语句中不会走索引。而nid和 addr会走索引。

    删除办法 (除主键)

    drop index_name on table_name;

    查看查询

    show index from table_name;

    注意

    列的类型为 blob和text时必须指定长度。两者太长没必要。

    create index ix_extra on in1(extra(32));

    =====================分割(都是概念)=======================

    覆盖索引

      覆盖索引时一种概念,指的是在索引时没有进行第二步在数据表中取数据,直接在索引表中取到了。

      如 select nid from table_name where nid >10;

      由于nid就是主键或者索引,并且取的数据都是索引的值。那程序只要将B-tree的值转化成数据就成。没有第二步步骤。

    索引合并

      索引合并是在索引过程中,运用到了两列以上作为条件限制。区别于组合索引。

      select * from table_name where nid = 23 and name = "ccc";

      nid是主键,name是普通索引。这样的索引形式成为索引合并。

      那么组合的仍有最左前缀的限制,为什么还存在组合索引?

      因为,有种情况是组合索引的最左是根。比如用户名和密码,没有人会脱离用户名去索引密码。

      并且,组合索引在这种索引多列的情况下优于索引合并的速率

    其他

      条件语句

      delimiter \

        CREATE PROCEDURE proc_if ()

        BEGIN

        declare i int default 0;

        if i = 1 THEN SELECT 1;

        ELSEIF i = 2 THEN SELECT 2;

        ELSE SELECT 7;

        END IF;

        END\

      delimiter ;

      循环语句

     1 delimiter \
     2 CREATE PROCEDURE proc_while ()
     3 BEGIN
     4 
     5     DECLARE num INT ;
     6     SET num = 0 ;
     7     WHILE num < 10 DO
     8         SELECT
     9             num ;
    10         SET num = num + 1 ;
    11     END WHILE ;
    12 
    13 END\
    14 delimiter ;
    while do
     1 delimiter \
     2 CREATE PROCEDURE proc_repeat ()
     3 BEGIN
     4 
     5     DECLARE i INT ;
     6     SET i = 0 ;
     7     repeat
     8         select i;
     9         set i = i + 1;
    10         until i >= 5
    11     end repeat;
    12 
    13 END\
    14 delimiter ;
    repeat
     1 delimiter \
     2 CREATE PROCEDURE proc_loop ()
     3 BEGIN
     4     
     5     declare i int default 0;
     6     loop_label: loop
     7         select i;
     8         set i=i+1;
     9         if i>=5 then
    10             leave loop_label;
    11             end if;
    12     end loop;
    13 
    14 END\
    15 delimiter ;
    loop

    动态执行SQL语句 

    # 将传送过来的数据输入某些sql语句

     1 delimiter \
     2 DROP PROCEDURE IF EXISTS proc_sql \
     3 CREATE PROCEDURE proc_sql ()
     4 BEGIN
     5     declare p1 int;
     6     set p1 = 11;
     7     set @p1 = p1;
     8 
     9     PREPARE prod FROM 'select * from tb2 where nid > ?';
    10     EXECUTE prod USING @p1;
    11     DEALLOCATE prepare prod; 
    12 
    13 END\
    14 delimiter ;
    View Code
  • 相关阅读:
    Spring Boot
    Spring Boot – Jetty配置
    如何使ESLint在Visual Studio 2019和2017中工作: 2019 v16和2017> = v15.8
    CentOS 7 安装 Nginx
    HTTPS-使用Certbot自动配置Let’s Encrypt证书
    centos7升级内核到最新版本
    [C#.net]Connection Timeout和Command Timeout
    Redis中切换db
    Redis 模糊查询删除操作
    [Abp vNext 源码分析]
  • 原文地址:https://www.cnblogs.com/khal-Cgg/p/6003463.html
Copyright © 2011-2022 走看看