zoukankan      html  css  js  c++  java
  • Python Day47索引

    一、MySQL索引管理:

        一 功能:

            1.索引的功能就是加速查找。    

            2.mysql中的pirmary key 和 unique,联合唯一也是索引,这些索引出了加速查找以外还有约束的功能。

    二 MySQL常用的索引:

        1.普通索引index:加速查找

        2.唯一索引:1 主键索引 pirmary key:加速查找+约束(不为空不能重复)

              2 唯一索引 unique:加速查找+约束(不能重复)

        3.联合索引: 1 pirmary key(Id,name):联合主键索引

                2 unique(id,name):联合唯一索引

                3 index(id,name):联合普通索引

    三、 创建/删除索引的语法:

          

      方法一:创建表时
            CREATE TABLE 表名 (
                      字段名1  数据类型 [完整性约束条件…],
                      字段名2  数据类型 [完整性约束条件…],
                      [UNIQUE | FULLTEXT | SPATIAL ]   INDEX | KEY
                      [索引名]  (字段名[(长度)]  [ASC |DESC]) 
                      );



      方法二:CREATE在已存在的表上创建索引
              CREATE  [UNIQUE | FULLTEXT | SPATIAL ]  INDEX  索引名 
                         ON 表名 (字段名[(长度)]  [ASC |DESC]) ;
      
      方法三:ALTER TABLE在已存在的表上创建索引
                ALTER TABLE 表名 ADD  [UNIQUE | FULLTEXT | SPATIAL ] INDEX
                                索引名 (字段名[(长度)]  [ASC |DESC]) ;
      
      删除索引:DROP INDEX 索引名 ON 表名字;


    
    
    方式一
    create table t1(
        id int,
        name char,
        age int,
        sex enum('male','female'),
        unique key uni_id(id),
        index ix_name(name) #index没有key
    );
    
    
    方式二
    create index ix_age on t1(age);
    
    方式三
    alter table t1 add index ix_sex(sex);
    
    查看
    mysql> show create table t1;
    | t1    | CREATE TABLE `t1` (
      `id` int(11) DEFAULT NULL,
      `name` char(1) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      `sex` enum('male','female') DEFAULT NULL,
      UNIQUE KEY `uni_id` (`id`),
      KEY `ix_name` (`name`),
      KEY `ix_age` (`age`),
      KEY `ix_sex` (`sex`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
     

     

    
    

    二 在没有索引的前提下测试查询速度

    
    
    #无索引:mysql根本就不知道到底是否存在id等于333333333的记录,只能把数据表从头到尾扫描一遍,此时有多少个磁盘块就需要进行多少IO操作,所以查询速度很慢
    mysql> select * from s1 where id=333333333;
    Empty set (0.33 sec)
    
    

    三 在表中已经存在大量数据的前提下,为某个字段段建立索引,建立速度会很慢

    
    

    
    

    四 在索引建立完毕后,以该字段为查询条件时,查询速度提升明显

    
    

    
    

    PS:

    
    

    1. mysql先去索引表里根据b+树的搜索原理很快搜索到id等于333333333的记录不存在,IO大大降低,因而速度明显提升

    
    

    2. 我们可以去mysql的data目录下找到该表,可以看到占用的硬盘空间多了

    
    

    3. 需要注意,如下图

    
    

    
    

    五 总结

    
    
    复制代码
    #1. 一定是为搜索条件的字段创建索引,比如select * from s1 where id = 333;就需要为id加上索引
    
    #2. 在表中已经有大量数据的情况下,建索引会很慢,且占用硬盘空间,建完后查询速度加快
    比如create index idx on s1(id);会扫描表中所有的数据,然后以id为数据项,创建索引结构,存放于硬盘的表中。
    建完以后,再查询就会很快了。
    
    #3. 需要注意的是:innodb表的索引会存放于s1.ibd文件中,而myisam表的索引则会有单独的索引文件table1.MYI
    
    MySAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在innodb中,表数据文件本身就是按照B+Tree(BTree即Balance True)组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此innodb表数据文件本身就是主索引。
    因为inndob的数据文件要按照主键聚集,所以innodb要求表必须要有主键(Myisam可以没有),如果没有显式定义,则mysql系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则mysql会自动为innodb表生成一个隐含字段作为主键,这字段的长度为6个字节,类型为长整型.






  • 相关阅读:
    006-Spring Boot自动配置-Condition、Conditional、Spring提供的Conditional自动配置
    005-Spring Boot配置分析-配置文件application、Environment、PropertySource、@Value、EnvironmentPostProcessor、Profiles
    新浪云php与java连接MySQL数据库
    基于网页内容数据采集 PHP开发学习笔记
    淘宝理财 中证500 中证300 基金收益计算
    响应式Web设计(Responsive Web design)
    FOJ 1075
    锐捷上网认证常见问题及解决办法
    session与cookie的区别
    php email邮箱正则验证
  • 原文地址:https://www.cnblogs.com/liuduo/p/7762180.html
Copyright © 2011-2022 走看看